⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 polymorph.py

📁 SQLAlchemy. 经典的Python ORM框架。学习必看。
💻 PY
字号:
from sqlalchemy import *from sqlalchemy.orm import *import sets# this example illustrates a polymorphic load of two classesmetadata = MetaData('sqlite://')metadata.bind.echo = True# a table to store companiescompanies = Table('companies', metadata,    Column('company_id', Integer, primary_key=True),   Column('name', String(50)))# we will define an inheritance relationship between the table "people" and "engineers",# and a second inheritance relationship between the table "people" and "managers"people = Table('people', metadata,    Column('person_id', Integer, primary_key=True),   Column('company_id', Integer, ForeignKey('companies.company_id')),   Column('name', String(50)),   Column('type', String(30)))   engineers = Table('engineers', metadata,    Column('person_id', Integer, ForeignKey('people.person_id'), primary_key=True),   Column('status', String(30)),   Column('engineer_name', String(50)),   Column('primary_language', String(50)),  )   managers = Table('managers', metadata,    Column('person_id', Integer, ForeignKey('people.person_id'), primary_key=True),   Column('status', String(30)),   Column('manager_name', String(50))   )   metadata.create_all()# create our classes.  The Engineer and Manager classes extend from Person.class Person(object):    def __init__(self, **kwargs):        for key, value in kwargs.iteritems():            setattr(self, key, value)    def __repr__(self):        return "Ordinary person %s" % self.nameclass Engineer(Person):    def __repr__(self):        return "Engineer %s, status %s, engineer_name %s, primary_language %s" % (self.name, self.status, self.engineer_name, self.primary_language)class Manager(Person):    def __repr__(self):        return "Manager %s, status %s, manager_name %s" % (self.name, self.status, self.manager_name)class Company(object):    def __init__(self, **kwargs):        for key, value in kwargs.iteritems():            setattr(self, key, value)    def __repr__(self):        return "Company %s" % self.nameperson_join = people.outerjoin(engineers).outerjoin(managers)person_mapper = mapper(Person, people, select_table=person_join,polymorphic_on=people.c.type, polymorphic_identity='person')mapper(Engineer, engineers, inherits=person_mapper, polymorphic_identity='engineer')mapper(Manager, managers, inherits=person_mapper, polymorphic_identity='manager')mapper(Company, companies, properties={    'employees': relation(Person, lazy=False, private=True, backref='company')})session = create_session(echo_uow=False)c = Company(name='company1')c.employees.append(Manager(name='pointy haired boss', status='AAB', manager_name='manager1'))c.employees.append(Engineer(name='dilbert', status='BBA', engineer_name='engineer1', primary_language='java'))c.employees.append(Person(name='joesmith', status='HHH'))c.employees.append(Engineer(name='wally', status='CGG', engineer_name='engineer2', primary_language='python'))c.employees.append(Manager(name='jsmith', status='ABA', manager_name='manager2'))session.save(c)print session.newsession.flush()session.clear()c = session.query(Company).get(1)for e in c.employees:    print e, e._instance_key, e.companyassert sets.Set([e.name for e in c.employees]) == sets.Set(['pointy haired boss', 'dilbert', 'joesmith', 'wally', 'jsmith'])print "\n"dilbert = session.query(Person).get_by(name='dilbert')dilbert2 = session.query(Engineer).get_by(name='dilbert')assert dilbert is dilbert2dilbert.engineer_name = 'hes dibert!'session.flush()session.clear()c = session.query(Company).get(1)for e in c.employees:    print e, e._instance_keysession.delete(c)session.flush()metadata.drop_all()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -