[pyar] Herencia en SQLAlchemy
Claudio Freire
klaussfreire en gmail.com
Mar Jul 29 14:41:20 ART 2014
On Tue, Jul 29, 2014 at 2:32 PM, Tomas Zulberti <tzulberti en gmail.com> wrote:
>>>> 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
Bueno, esa es la idea de single-table inheritance.
Cuando hacés herencia así, quiere decir que todo usuario es una
persona, e insertar un usuario ES insertar una persona.
Incluso en OOP, al hacer esa herencia, quiere decir que Persona hereda
un campo "email" que es "nullable=false".
La solución, si realmente un usuario no necesita email, es muy OOP.
class PersonaAbstracta(db.Model):
__abstract__ = True
__mapper_args__ = {'polymorphic_on': 'person_type'}
id = db.Column(db.Integer, nullable=False, primary_key=True)
person_type = db.Column(db.String(20), nullable=False)
class Persona(db.Model):
__mapper_args__ = {'polymorphic_identity': 'persona'}
email = db.Column(db.String(1024), nullable=False)
class Usuario(PersonaAbstracta):
__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)
More information about the pyar
mailing list