[pyar] Herencia en SQLAlchemy

Jose Selesan jselesan en gmail.com
Mie Jul 30 08:25:11 ART 2014


Hola. Soy muy nuevo en Python, pero desde el punto de vista de OOP y ORM,
lo que estás queriendo hacer es "transformar" una Persona en Usuario, y
digo transformar porque si ya está almacenado en la tabla de persona, para
el ORM es de tipo Persona. No se si SQLAlchemy tiene algún tipo de
conversión como para decirle "lee esta persona de la base de datos,
convertila a Usuario con estos campos de la tabla usuario y volvé a
persistirla"

José


2014-07-30 8:16 GMT-03:00 Tomas Zulberti <tzulberti en gmail.com>:

> Hola.
>
> Por ahi se entendio mal la pregunta.
>
> Simpre que hago:
>
> >>> usuario = Usuario(...)
> >>> db.session.add(usuario)
> >>> db.session.commt()
>
> Esto crea tambien un valor en la tabla de persona.
>
> Ahora el problema que yo tengo es que el valor en la tabla de persona
> ya esta creado, y quiero crear solo los valores en la tabla de
> Usuario.
>
> # Hace mucho tiempo
> >>> persona = Persona(...)
> >>> db.session.add(persona)
> >>> db.session.commit()
>
> # Ahora quiero crear los valores en la tabla de Usuario para esa persona
> >>> usuario = "NO SE COMO HACERLO..."
> >>> db.session.add(usuario)
> >>> db.session.commt()
>
> Muchas gracias,
> TZ
>
> 2014-07-29 14:41 GMT-03:00 Mariano Mara <mariano.mara en gmail.com>:
> >
> > 2014-07-29 14:32 GMT-03:00 Tomas Zulberti <tzulberti en gmail.com>:
> >
> >> Hola.
> >>
> >> Tengo dos modelos en SQLAlchemy:
> >>
> >> - Persona
> >> - Usuario
> >>
> >> Donde quiero que Usuario extienda de Persona. El tema es que a
> >> diferencia de los ejemplos de SQLAlchemy, la clase base Persona tiene
> >> sentido sola. Es decir, existe un registro de varias personas, y para
> >> alguna de ellas se crea el registro de Usuario.
> >>
> >> Los modelos son algo asi:
> >>
> >> class Persona(db.Model):
> >>      __mapper_args__ = {'polymorphic_on': 'person_type'}
> >>      id = db.Column(db.Integer, nullable=False, primary_key=True)
> >>      email = db.Column(db.String(1024), nullable=False)
> >>      person_type = db.Column(db.String(20), nullable=False)
> >>
> >>
> >>
> >> class Usuario(Persona):
> >>      __mapper_args__ = {'polymorphic_identity': 'usuario'}
> >>      id = db.Column(db.Integer, db.ForeignKey('persona.id'),
> >> primary_key=True, nullable=False)
> >>      password = db.Column(db.String(1024), nullable=False)
> >>
> >>
> >> El problema es que quiero poder hacer algo como esto y no encuentro la
> >> forma:
> >>
> >> >>> p = Person(email='pepe en gmail.com')
> >> >>> db.session.add(p)
> >> >>> db.session.commit()
> >> >>> print p.id
> >> 3
> >> >>> u = Usuario(id=3, password='UN HASH')
> >> >>> db.session.add(u)
> >> >>> db.session.commit()
> >> (IntegrityError) null value in column "email" violates not-null
> constraint
> >> 'INSERT INTO persona (id, name,
> >>
> >> Es decir, esta intentando de insertar una persona cuando yo lo unico
> >> que quiero que cree es el valor de una persona
> >>
> >>
> > No uses Single Table inheritance, usá una joined table y pone los
> atributos
> > que sean excluyentes de cada clase en su table particular (por ejemplo el
> > mail que es excluyente para Personas y no para usuarios). De otra forma
> el
> > nullable del email te lo va a exigir siempre porque es una constraint a
> > nivel de modelo de datos.
> >
> >
> > _______________________________________________
> > pyar mailing list pyar en python.org.ar
> > http://listas.python.org.ar/listinfo/pyar
> >
> > PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
> >
> > La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> > Argentina - http://www.usla.org.ar
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140730/369e759c/attachment-0001.html>


More information about the pyar mailing list