[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