FOREIGN KEY constraint failed - ayuda

46 views
Skip to first unread message

Jorge Cedermaz

unread,
Aug 24, 2015, 3:43:56 PM8/24/15
to web2py-usuarios
Buenas, de nuevo por aqui requiriendo de su ayuda. Tengo el siguiente modelo:

############-CIRUGIA-####################################################################################################
db.define_table("cirugia",
    Field("id_sucursal", "reference sucursal", notnull=True, label="Sucursal"),
    Field("id_servicio", "reference servicio_medico", notnull=True, label="Servicio Medico"),
    Field("id_material", "reference material", label="Material"),
    Field("fecha", "datetime", default=None, label="Fecha Cirugia"),
    Field("cirugia_gesem", "string", length=10, default=None))
db.cirugia.id_sucursal.requires = IS_IN_DB(db, 'sucursal.id','%(sucursal)s', zero=T('Elige una Sucursal'))
db.cirugia.id_servicio.requires = IS_IN_DB(db, 'servicio_medico.id','%(denominacion)s', zero=T('Elige un Servicio Medico'))
db.cirugia.id_material.requires = IS_IN_DB(db, 'material.id','%(denominacion)s', zero=T('Elige un Material'))
#########################################################################################################################

############-ENTIDADES-###########################################################################################
db.define_table("entidad",
    Field("nombre", "string", length=45, notnull=True),
    Field("apellido", "string", length=44, notnull=True),
    Field("dni", "integer", length=8, default=None),
    Field("fecha_Nac", "date", default=None),
    Field("sexo", "list:string", length=1, notnull=True, default='Masculino'),
    Field("telefono", "string", length=45, default=None),
    Field("direccion", "string", length=45, default=None),
        format='%(apellido)s  %(nombre)s')
db.entidad.sexo.requires = [IS_IN_SET(['Masculino','Femenino'],zero=T('Seleccione uno...'),error_message=('Elige un sexo')),IS_NOT_EMPTY(error_message='debe eligir un sexo')]
db.entidad.sexo.widget = SQLFORM.widgets.multiple.widget
########################################################################################################################

############-ROLES-######################################################################################################
db.define_table("roles",
    Field("denominacion", "string", length=45, notnull=True),
        format='%(denominacion)s')
#########################################################################################################################

Y la tabla muchos a muchos:

############-CIRUGIA ENTIDAD-############################################################################################
db.define_table("cirugia_entidad",
    Field("id_cirugia", "reference cirugia"),
    Field("id_rol", "reference roles"),
    Field("id_entidad", "reference entidad"))
db.cirugia_entidad.id_cirugia.requires = IS_IN_DB(db, 'cirugia.id')
db.cirugia_entidad.id_rol.requires = IS_IN_DB(db, 'roles.id')
db.cirugia_entidad.id_entidad.requires = IS_IN_DB(db, 'entidad.id')
#########################################################################################################################

Desde el controlador nueva_cirugia hago lo siguiente:

def nueva_cirugia():
    cliente = db((db.entidad.id==db.rol_entidad.id_entidad) & (db.roles.id==db.rol_entidad.id_rol) & (db.roles.denominacion=='Cliente')).select(db.entidad.id, db.entidad.apellido, db.entidad.nombre)
    paciente = db((db.entidad.id==db.rol_entidad.id_entidad) & (db.roles.id==db.rol_entidad.id_rol) & (db.roles.denominacion=='Paciente')).select(db.entidad.id, db.entidad.apellido, db.entidad.nombre)
    medico = db((db.entidad.id==db.rol_entidad.id_entidad) & (db.roles.id==db.rol_entidad.id_rol) & (db.roles.denominacion=='Medico')).select(db.entidad.id, db.entidad.apellido, db.entidad.nombre)
    instrumentador = db((db.entidad.id==db.rol_entidad.id_entidad) & (db.roles.id==db.rol_entidad.id_rol) & (db.roles.denominacion=='Instrumentador')).select(db.entidad.id, db.entidad.apellido, db.entidad.nombre)
###cargo lista despegable cliente   
    idc=[]
    c =[]
    for i in cliente:
       idc.append(i.id)
       desc = i.apellido + ' ' + i.nombre
       c.append(desc)
###cargo lista despegable paciente
    idp=[]
    p =[]
    for i in paciente:
       idp.append(i.id)
       desp = i.apellido + ' ' + i.nombre
       p.append(desp)
###cargo lista despegable medico
    idm=[]
    m =[]
    for i in medico:
       idm.append(i.id)
       desm = i.apellido + ' ' + i.nombre
       m.append(desm)
###cargo lista despegable instrumentador
    idi=[]
    ins =[]
    for i in instrumentador:
       idi.append(i.id)
       desi = i.apellido + ' ' + i.nombre
       ins.append(desi)
###genero el formulario de ingreso       
    form = SQLFORM.factory(db.cirugia,
                           Field('Cliente', requires=IS_IN_SET(idc, labels=c,zero=T('Elige un Cliente'), error_message='Elige una opcion')),
                           Field('Paciente', requires=IS_IN_SET(idp, labels=p,zero=T('Elige un Paciente'), error_message='Elige una opcion')),
                           Field('Medico', requires=IS_IN_SET(idm, labels=m,zero=T('Elige un Medico'), error_message='Elige una opcion')),
                           Field('Instrumentador', requires=IS_IN_SET(idi, labels=ins,zero=T('Elige un Medico'))),
                           )
    if form.process().accepted:
         idcirugia = db.cirugia.insert(id_sucursal=form.vars.id_sucursal, id_servicio=form.vars.id_servicio, id_material=form.vars.id_material, fecha=form.vars.fecha, cirugia_gesem=form.vars.cirugia_gesem)
         if request.vars.Cliente:
            idrol=db(db.roles.denominacion=='Cliente').select(db.roles.id)
            id=db.cirugia_entidad.insert(id_cirugia=idcirugia,id_rol=idrol[0].id, id_entidad=form.vars.Cliente)
         if request.vars.Paciente:
            idrol=db(db.roles.denominacion=='Paciente').select(db.roles.id)
            db.cirugia_entidad.insert(id_cirugia=idcirugia,id_rol=idrol[0].id, id_entidad=form.vars.Paciente)
         if request.vars.Medico:
            db(db.roles.denominacion=='Medico').select(db.roles.id)
            db.cirugia_entidad.insert(id_cirugia=idcirugia,id_rol=idrol[0].id, id_entidad=form.vars.Medico)
         if request.vars.Instrumentador:
            db(db.roles.denominacion=='Instrumentador').select(db.roles.id)
            db.cirugia_entidad.insert(id_cirugia=idcirugia,id_rol=idrol[0].id, id_entidad=form.vars.Instrumentador)
         nueva=True
         redirect(URL('cirugia_estado', args=[nueva, idcirugia]))
    return dict(form=form)
 

Cuando quiero guardar en la table cirugia_entidad, recibo este error:

27.0.0.1.2015-08-24.16-34-31.03743cf3-d269-4a9f-bc7a-4735c65f3630

<class 'pysqlite2.dbapi2.IntegrityError'> FOREIGN KEY constraint failed

Versión

web2py™ Version 2.9.11-stable+timestamp.2014.09.15.23.35.11

Rastreo

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Traceback (most recent call last):
File "/home/jorge/Descargas/Desarrollo/Python/web2py/web2py/gluon/restricted.py", line 224, in restricted
exec ccode in environment
File "/home/jorge/Descargas/Desarrollo/Python/web2py/web2py/applications/SegPlus/controllers/default.py", line 204, in <module>
File "/home/jorge/Descargas/Desarrollo/Python/web2py/web2py/gluon/globals.py", line 392, in <lambda>
self._caller = lambda f: f()
File "/home/jorge/Descargas/Desarrollo/Python/web2py/web2py/gluon/tools.py", line 3439, in f
return action(*a, **b)
File "/home/jorge/Descargas/Desarrollo/Python/web2py/web2py/applications/SegPlus/controllers/default.py", line 174, in nueva_cirugia
id=db.cirugia_entidad.insert(id_cirugia=idcirugia,id_rol=idrol[0].id, id_entidad=form.vars.Cliente)
File "/home/jorge/Descargas/Desarrollo/Python/web2py/web2py/gluon/dal.py", line 9317, in insert
ret = self._db._adapter.insert(self, self._listify(fields))
File "/home/jorge/Descargas/Desarrollo/Python/web2py/web2py/gluon/dal.py", line 1361, in insert
raise e
IntegrityError: FOREIGN KEY constraint failed


Marco Mansilla

unread,
Aug 24, 2015, 11:56:31 PM8/24/15
to web2py-...@googlegroups.com
El Mon, 24 Aug 2015 12:43:55 -0700 (PDT)
Jorge Cedermaz <cederma...@gmail.com> escribió:
> <http://127.0.0.1:8000/admin/default/edit/SegPlus/controllers/default.py>,
> line 204, in <module> File
> "/home/jorge/Descargas/Desarrollo/Python/web2py/web2py/gluon/globals.py",
> line 392, in <lambda> self._caller = lambda f: f() File
> "/home/jorge/Descargas/Desarrollo/Python/web2py/web2py/gluon/tools.py",
> line 3439, in f return action(*a, **b) File
> "/home/jorge/Descargas/Desarrollo/Python/web2py/web2py/applications/SegPlus/controllers/default.py"
> <http://127.0.0.1:8000/admin/default/edit/SegPlus/controllers/default.py>,
> line 174, in nueva_cirugia
> id=db.cirugia_entidad.insert(id_cirugia=idcirugia,id_rol=idrol[0].id,
> id_entidad=form.vars.Cliente) File
> "/home/jorge/Descargas/Desarrollo/Python/web2py/web2py/gluon/dal.py",
> line 9317, in insert ret = self._db._adapter.insert(self,
> self._listify(fields)) File
> "/home/jorge/Descargas/Desarrollo/Python/web2py/web2py/gluon/dal.py",
> line 1361, in insert raise e IntegrityError: FOREIGN KEY constraint
> failed
>
>
>

Lo mas probable es que en algun momento hayas cambiado un campo que
hacia referencia a otro, lo hayas eliminado o cambiado de referencia,
en tal caso deberias renombrar a ese campo, de otra manera el problema
se dispara.

Si no tenes control de versiones vas a tener que hacer memoria sobre
los ultimos cambios que realizaste en la aplicacion.


id=db.cirugia_entidad.insert(id_cirugia=idcirugia,id_rol=idrol[0].id,
id_entidad=form.vars.Cliente)

Aca donde asignas las referencias pueden haber cambios incompatibles en
la tabla o en la consulta.

Jorge Cedermaz

unread,
Aug 25, 2015, 7:09:48 AM8/25/15
to web2py-usuarios
Marcos: gracias por tu respuesta. Control de versiones, no hago :( Hay algún log que pueda revisar para ver los posibles cambios realizados. No recuerdo haber realizados cambios sobre esa tabla.

Saludos!!!

Jorge Cedermaz

unread,
Aug 25, 2015, 7:14:33 AM8/25/15
to web2py-usuarios
Ahora recuerdo que si hice un cambio. En la tabla entidad, antes yo tenia un campo que se llamaba rol y que era un list:string. Y acá hacia la relación muchos a muchos. Después me arrepentí de esto y genere el modelo que se ve acá. Como puedo corregir esto para subsanar este error pero respetando este nuevo modelo?

Carlos Cesar Caballero Díaz

unread,
Aug 25, 2015, 8:29:16 AM8/25/15
to web2py-...@googlegroups.com
Eso me suele pasar mucho cuando uso sqlite, debido a que las migraciones dan su problema, casi siempre corto por lo sano, y elimino la bd (todo el contenido de la carpeta databases) y la vuelvo a generar, para así eliminar todo lo que las migraciones han hecho de mas, si la app no esta en producción, y los datos son de prueba, esa es mi recomendación.

Saludos.

El 25/08/15 a las 07:14, Jorge Cedermaz escribió:
--
Has recibido este mensaje porque estás suscrito al grupo "web2py-usuarios" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a web2py-usuari...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Jorge Cedermaz

unread,
Aug 25, 2015, 9:07:20 AM8/25/15
to web2py-usuarios
Carlos: muchísimas gracias por tu respuesta. Hice eso y salio funcionando todo sin problemas!!!

Saludos!!!

Marco Mansilla

unread,
Sep 2, 2015, 1:52:22 AM9/2/15
to web2py-...@googlegroups.com
El Tue, 25 Aug 2015 04:09:47 -0700 (PDT)
Jorge Cedermaz <cederma...@gmail.com> escribió:

> Marcos: gracias por tu respuesta. Control de versiones, no
> hago :( Hay algún log que pueda revisar para ver los posibles cambios
> realizados. No recuerdo haber realizados cambios sobre esa tabla.
>
> Saludos!!!
>

Asi como log creo que no, por las dudas fijate en sql.log... pero seria
bueno que uses control de versiones, aunque sea localmente para evitar
estas cosas, te lo digo por experiencia... es un dolor de cabeza.

Saludos.

Jorge Cedermaz

unread,
Sep 2, 2015, 8:24:11 AM9/2/15
to web2py-usuarios
Marcos: que usas para control de versiones?

Marco Mansilla

unread,
Sep 6, 2015, 1:56:39 AM9/6/15
to web2py-...@googlegroups.com
El Wed, 2 Sep 2015 05:24:11 -0700 (PDT)
Jorge Cedermaz <cederma...@gmail.com> escribió:

> Marcos: que usas para control de versiones?
>
> El miércoles, 2 de septiembre de 2015, 2:52:22 (UTC-3), marco
> mansilla escribió:
> >
> > El Tue, 25 Aug 2015 04:09:47 -0700 (PDT)
> > Jorge Cedermaz <cederma...@gmail.com <javascript:>> escribió:
> >
> > > Marcos: gracias por tu respuesta. Control de versiones, no
> > > hago :( Hay algún log que pueda revisar para ver los posibles
> > > cambios realizados. No recuerdo haber realizados cambios sobre
> > > esa tabla.
> > >
> > > Saludos!!!
> > >
> >
> > Asi como log creo que no, por las dudas fijate en sql.log... pero
> > seria bueno que uses control de versiones, aunque sea localmente
> > para evitar estas cosas, te lo digo por experiencia... es un dolor
> > de cabeza.
> >
> > Saludos.
> >
>

Git, con eso basta y sobra para todo lo referente a eso, puedes usarlo
localmente, con servicios como github o montar tu propio servidor
privado con algo como gitnus....

Nicolás Rosbaco

unread,
Oct 11, 2016, 8:39:42 PM10/11/16
to web2py-usuarios
Hola chicos.... el tema es viejo pero tengo este mismo problema.
Borré la Base de datos, apostando a que era el problema y no tenía más de tres registros en ella...
No se solucionó!
Estoy intentando crear un nuevo registro con SQLFORM, es en una tabla que tiene un campo referencia a otra tabla...
Les copio controlador, vista y modelos... (veo si este mensaje se lee a pesar del tiempo transcurrido)

controlador:
def index():
    tabla = request.args(0)
    form = SQLFORM.grid(db[tabla], args=request.args[:1],user_signature=False)
    return locals()


vista:
{{extend 'layout.html'}}
{{=HR()}}
{{=H3('ABM en la tabla: ',request.args(0))}}
{{=HR()}}
{{=BEAUTIFY(form)}}


El modelo:
db.define_table('telefonicas',
    Field('nombre', label='Empresa',requires=IS_NOT_EMPTY()),format='%(nombre)s')

db.define_table('clientes',
    Field('dni', label='DNI',requires=IS_NOT_EMPTY(),unique=True),
    Field('nombre', label='Nombre',requires=IS_NOT_EMPTY()),
    Field('apellido', label='Apellido Propietario', requires=IS_NOT_EMPTY()),
    Field('avatar', 'upload', label='Imagen Cliente', requires = [IS_EMPTY_OR(IS_IMAGE())]),
    Field('fecnac', 'date', label='Fecha Nacimiento'),
    Field('companiaTelefono', 'reference telefonicas', label='Empresa Telefonía',requires=IS_IN_DB(db, 'telefonicas.nombre', '%(nombre)s')),
    Field('telefono', label='Nro Telefono'),
    Field('email',requires = [IS_EMAIL()]))



GRACIAS MIL^3




El martes, 25 de agosto de 2015, 9:29:16 (UTC-3), Carlos Cesar Caballero escribió:

Luis Díaz

unread,
Oct 12, 2016, 10:36:54 PM10/12/16
to web2py-...@googlegroups.com
saludos.

me dio curiocidad, asi que copie tu codigo y lo modifique 
de la siguiente forma, en la parte del controlador:

def index():
    form = SQLFORM.grid(db.clientes,user_signature=False)
    return dict(form=form)


def tlf():
    form = SQLFORM.grid(db.telefonicas,user_signature=False)
    return dict(form=form)

y pues bien, a mi no me da fallo..

a claro, en la parte del modelo hice el siguiente cambio:
Field('companiaTelefono', 'reference telefonicas', label='Empresa Telefonía',requires=IS_IN_DB(db, 'telefonicas.id', db.telefonicas._format)),




Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a web2py-usuarios+unsubscribe@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
http://www.about.me/diazluis
Analista Programador
Linux, Python, VPS, Developer Web (html, javascript, css)
Reply all
Reply to author
Forward
0 new messages