[pyar] Herencia en SQLAlchemy

Tomas Zulberti tzulberti en gmail.com
Mie Jul 30 08:58:42 ART 2014


Hola.

Muchisimas gracias. Habia pensado que el tema de la FK solucionaba mi
problema pero queria saber si se podia hacer mediante herencia

Saludos,
TZ

2014-07-30 8:56 GMT-03:00 Ariel Rossanigo <arielrossanigo en gmail.com>:
> Hola Tomas,  en el escenario que planteas estarias cambiando la clase de una
> instancia; lo cual en principio no es muy OOP que digamos.
> Si bien no es lo que preguntas, tal vez te pueda servir el patron role [0].
> Básicamente sirve para casos como este, una persona es un objeto por si
> mismo y en algún momento cumple determinado rol, en tu caso pasa a ser un
> usuario; lo cual implica la generación de ese nuevo rol. En términos de
> modelado, el usuario no hereda de persona sino que tiene una Fk con persona.
>
> Espero que sirva,
> Saludos
>
> Ariel
> [0]: http://en.wikipedia.org/wiki/Role_Class_Model
>
>
> El 30 de julio de 2014, 8:16, Tomas Zulberti<tzulberti en gmail.com> escribió:
>
>> 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
>
>
>
> _______________________________________________
> 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


More information about the pyar mailing list