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

📄 polymorph.py

📁 SQLAlchemy. 经典的Python ORM框架。学习必看。
💻 PY
📖 第 1 页 / 共 2 页
字号:
"""tests basic polymorphic mapper loading/saving, minimal relations"""import testenv; testenv.configure_for_tests()import setsfrom sqlalchemy import *from sqlalchemy.orm import *from testlib import *class Person(object):    def __init__(self, **kwargs):        for key, value in kwargs.iteritems():            setattr(self, key, value)    def get_name(self):        try:            return getattr(self, 'person_name')        except AttributeError:            return getattr(self, 'name')    def __repr__(self):        return "Ordinary person %s" % self.get_name()class Engineer(Person):    def __repr__(self):        return "Engineer %s, status %s, engineer_name %s, primary_language %s" % (self.get_name(), self.status, self.engineer_name, self.primary_language)class Manager(Person):    def __repr__(self):        return "Manager %s, status %s, manager_name %s" % (self.get_name(), self.status, self.manager_name)class Boss(Manager):    def __repr__(self):        return "Boss %s, status %s, manager_name %s golf swing %s" % (self.get_name(), self.status, self.manager_name, self.golf_swing)class Company(object):    def __init__(self, **kwargs):        for key, value in kwargs.iteritems():            setattr(self, key, value)    def __repr__(self):        return "Company %s" % self.nameclass PolymorphTest(ORMTest):    def define_tables(self, metadata):        global companies, people, engineers, managers, boss        # a table to store companies        companies = Table('companies', metadata,           Column('company_id', Integer, Sequence('company_id_seq', optional=True), 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, Sequence('person_id_seq', optional=True), 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))           )        boss = Table('boss', metadata,            Column('boss_id', Integer, ForeignKey('managers.person_id'), primary_key=True),            Column('golf_swing', String(30)),            )        metadata.create_all()class CompileTest(PolymorphTest):    def testcompile(self):        person_join = polymorphic_union( {            'engineer':people.join(engineers),            'manager':people.join(managers),            'person':people.select(people.c.type=='person'),            }, None, 'pjoin')        person_mapper = mapper(Person, people, select_table=person_join, polymorphic_on=person_join.c.type, polymorphic_identity='person')        mapper(Engineer, engineers, inherits=person_mapper, polymorphic_identity='engineer')        mapper(Manager, managers, inherits=person_mapper, polymorphic_identity='manager')        session = create_session()        session.save(Manager(name='Tom', status='knows how to manage things'))        session.save(Engineer(name='Kurt', status='knows how to hack'))        session.flush()        print session.query(Engineer).all()        print session.query(Person).all()    def testcompile2(self):        """test that a mapper can reference a property whose mapper inherits from this one."""        person_join = polymorphic_union( {            'engineer':people.join(engineers),            'manager':people.join(managers),            'person':people.select(people.c.type=='person'),            }, None, 'pjoin')        person_mapper = mapper(Person, people, select_table=person_join, polymorphic_on=person_join.c.type,                    polymorphic_identity='person',                    properties = dict(managers = relation(Manager, lazy=True))                )        mapper(Engineer, engineers, inherits=person_mapper, polymorphic_identity='engineer')        mapper(Manager, managers, inherits=person_mapper, polymorphic_identity='manager')        #person_mapper.compile()        class_mapper(Manager).compile()class InsertOrderTest(PolymorphTest):    def test_insert_order(self):        """test that classes of multiple types mix up mapper inserts        so that insert order of individual tables is maintained"""        person_join = polymorphic_union(            {                'engineer':people.join(engineers),                'manager':people.join(managers),                'person':people.select(people.c.type=='person'),            }, None, 'pjoin')        person_mapper = mapper(Person, people, select_table=person_join, polymorphic_on=person_join.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,                                  cascade="all, delete-orphan",                                  backref='company',                                  order_by=person_join.c.person_id)        })        session = create_session()        c = Company(name='company1')        c.employees.append(Manager(status='AAB', manager_name='manager1', name='pointy haired boss'))        c.employees.append(Engineer(status='BBA', engineer_name='engineer1', primary_language='java', name='dilbert'))        c.employees.append(Person(status='HHH', name='joesmith'))        c.employees.append(Engineer(status='CGG', engineer_name='engineer2', primary_language='python', name='wally'))        c.employees.append(Manager(status='ABA', manager_name='manager2', name='jsmith'))        session.save(c)        session.flush()        session.clear()        c = session.query(Company).get(c.company_id)        for e in c.employees:            print e, e._instance_key, e.company        assert [e.get_name() for e in c.employees] == ['pointy haired boss', 'dilbert', 'joesmith', 'wally', 'jsmith']class RelationToSubclassTest(PolymorphTest):    def testrelationtosubclass(self):        """test a relation to an inheriting mapper where the relation is to a subclass        but the join condition is expressed by the parent table.        also test that backrefs work in this case.        this test touches upon a lot of the join/foreign key determination code in properties.py        and creates the need for properties.py to search for conditions individually within        the mapper's local table as well as the mapper's 'mapped' table, so that relations        requiring lots of specificity (like self-referential joins) as well as relations requiring        more generalization (like the example here) both come up with proper results."""        mapper(Person, people)        mapper(Engineer, engineers, inherits=Person)        mapper(Manager, managers, inherits=Person)        mapper(Company, companies, properties={            'managers': relation(Manager, lazy=True,backref="company")        })        sess = create_session()        c = Company(name='company1')        c.managers.append(Manager(status='AAB', manager_name='manager1', name='pointy haired boss'))        sess.save(c)        sess.flush()        sess.clear()        sess.query(Company).filter_by(company_id=c.company_id).one()        assert sets.Set([e.get_name() for e in c.managers]) == sets.Set(['pointy haired boss'])

⌨️ 快捷键说明

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