I implemented unified table inheritance as described in SQLAlchemy Inheritance question.
There is the following situation: I would like to have
- User who has
emailaddress - An alias that assigns an alias -
emailaddress another email address
To keep emailaddress unique, the idea would be for both classes to inherit from emailaddress , using combined table inheritance. The following classes are implemented in the examples:
emailaddressEmailaddressUser(Emailaddress)EmailaddressAlias(Emailaddress)
Inheritance allows you to use the following:
u = EmailaddressUser(name="Testuser", emailaddress="testuser@test.com")
=> I do not need to instantiate emailaddress in advance, which makes it easier to use.
Unfortunately, the same does not work for EmailaddressAlias , although the only difference is the second attribute, which is ForeignKey for the same emailaddress attribute. Therefore, I need to specify the inherit_condition property. BUT:
a = EmailaddressAlias ( real_emailaddress="testuser@test.com", alias_emailaddress="tu@test.com" )
-> Throws an IntegrityError when adding it to the database. See the full example here:
import sqlalchemy as sa import sqlalchemy.orm as orm from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Emailaddress(Base): __tablename__ = 'emailaddresses' emailaddress = sa.Column(sa.String, primary_key=True) emailtype = sa.Column(sa.String, nullable=False) __mapper_args__ = {'polymorphic_on': emailtype} class EmailaddressUser(Emailaddress): __tablename__ = 'emailaddress_users' __mapper_args__ = {'polymorphic_identity': 'user'} emailaddress = sa.Column( sa.String, sa.ForeignKey('emailaddresses.emailaddress'), primary_key=True) name = sa.Column(sa.String, nullable=False) class EmailaddressAlias(Emailaddress): __tablename__ = 'emailaddresses_alias' alias_emailaddress = sa.Column( sa.String, sa.ForeignKey('emailaddresses.emailaddress'), primary_key=True) real_emailaddress = sa.Column( sa.ForeignKey('emailaddresses.emailaddress'), nullable=False) __mapper_args__ = { 'polymorphic_identity': 'alias', 'inherit_condition':Emailaddress.emailaddress==alias_emailaddress} if __name__ == '__main__': engine = sa.create_engine ('sqlite:///email.sqlite', echo=True) Base.metadata.bind = engine Base.metadata.create_all () Session = orm.sessionmaker (engine) session = Session ()
python inheritance sqlalchemy
Philipp der Rautenberg Dec 05 '11 at 17:50 2011-12-05 17:50
source share