Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 3rd, 2012  |  syntax: None  |  size: 1.59 KB  |  hits: 10  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. # -*- coding: utf-8 -*-
  2.  
  3. from sqlalchemy import Column, String, Integer, ForeignKey, create_engine
  4. from sqlalchemy.orm import sessionmaker, relation
  5. from sqlalchemy.ext import declarative
  6.  
  7. engine = create_engine('sqlite:///:memory:')
  8. Session = sessionmaker(bind=engine)
  9. session = Session()
  10.  
  11. Base = declarative.declarative_base()
  12.  
  13. class MailAddress(Base):
  14.     __tablename__ = 'mail_addresses'
  15.     id = Column(Integer, primary_key=True)
  16.     addr = Column(String(256), nullable=False)
  17.     user_id = Column(Integer, ForeignKey('users.id'))
  18.  
  19.     def __init__(self, addr):
  20.         self.addr = addr
  21.  
  22. class Person(Base):
  23.     __tablename__ = 'users'
  24.     id = Column(Integer, primary_key=True)
  25.     name = Column(String(64), nullable=False)
  26.  
  27.     _discriminator = Column(String(32))
  28.     __mapper_args__ = {'polymorphic_on': _discriminator,
  29.                        'polymorphic_identity': 'user'}
  30.  
  31.     def __init__(self, name):
  32.         self.name = name
  33.  
  34. class Engineer(Person):
  35.     __mapper_args__ = {'polymorphic_identity': 'engineer'}
  36.     mail_addresses = relation('MailAddress', backref='engineer')
  37.  
  38.     def __init__(self, name, addr):
  39.         super(Engineer, self).__init__(name)
  40.         self.mail_addresses.append(MailAddress(addr))
  41.  
  42. Base.metadata.create_all(engine)
  43.  
  44. john = Person('John Doe')
  45. jane = Engineer('Jane Doe', 'jane@example.com')
  46. session.add_all([john, jane])
  47. session.commit()
  48.  
  49. def get_mail_addresses(person):
  50.     if hasattr(person, 'mail_addresses'):
  51.         return [a.addr for a in person.mail_addresses]
  52. for p in session.query(Person).all():
  53.     print '%s\'s mail addresses: %s' % \
  54.             (p.name, get_mail_addresses(p))