~ubuntu-branches/debian/jessie/sqlalchemy/jessie

« back to all changes in this revision

Viewing changes to examples/inheritance/polymorph.py

  • Committer: Package Import Robot
  • Author(s): Piotr Ożarowski, Jakub Wilk, Piotr Ożarowski
  • Date: 2013-07-06 20:53:52 UTC
  • mfrom: (1.4.23) (16.1.17 experimental)
  • Revision ID: package-import@ubuntu.com-20130706205352-ryppl1eto3illd79
Tags: 0.8.2-1
[ Jakub Wilk ]
* Use canonical URIs for Vcs-* fields.

[ Piotr Ożarowski ]
* New upstream release
* Upload to unstable
* Build depend on python3-all instead of -dev, extensions are not built for
  Python 3.X 

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
from sqlalchemy import MetaData, Table, Column, Integer, String, \
2
 
    ForeignKey, create_engine
3
 
from sqlalchemy.orm import mapper, relationship, sessionmaker
4
 
 
5
 
 
6
 
# this example illustrates a polymorphic load of two classes
7
 
 
8
 
metadata = MetaData()
9
 
 
10
 
# a table to store companies
11
 
companies = Table('companies', metadata,
12
 
   Column('company_id', Integer, primary_key=True),
13
 
   Column('name', String(50)))
14
 
 
15
 
# we will define an inheritance relationship between the table "people" and
16
 
# "engineers", and a second inheritance relationship between the table
17
 
# "people" and "managers"
18
 
people = Table('people', metadata,
19
 
   Column('person_id', Integer, primary_key=True),
20
 
   Column('company_id', Integer, ForeignKey('companies.company_id')),
21
 
   Column('name', String(50)),
22
 
   Column('type', String(30)))
23
 
 
24
 
engineers = Table('engineers', metadata,
25
 
   Column('person_id', Integer, ForeignKey('people.person_id'),
26
 
                                    primary_key=True),
27
 
   Column('status', String(30)),
28
 
   Column('engineer_name', String(50)),
29
 
   Column('primary_language', String(50)),
30
 
  )
31
 
 
32
 
managers = Table('managers', metadata,
33
 
   Column('person_id', Integer, ForeignKey('people.person_id'),
34
 
                                    primary_key=True),
35
 
   Column('status', String(30)),
36
 
   Column('manager_name', String(50))
37
 
   )
38
 
 
39
 
# create our classes.  The Engineer and Manager classes extend from Person.
40
 
class Person(object):
41
 
    def __init__(self, **kwargs):
42
 
        for key, value in kwargs.iteritems():
43
 
            setattr(self, key, value)
44
 
    def __repr__(self):
45
 
        return "Ordinary person %s" % self.name
46
 
class Engineer(Person):
47
 
    def __repr__(self):
48
 
        return "Engineer %s, status %s, engineer_name %s, "\
49
 
                "primary_language %s" % \
50
 
                    (self.name, self.status,
51
 
                        self.engineer_name, self.primary_language)
52
 
class Manager(Person):
53
 
    def __repr__(self):
54
 
        return "Manager %s, status %s, manager_name %s" % \
55
 
                    (self.name, self.status, self.manager_name)
56
 
class Company(object):
57
 
    def __init__(self, **kwargs):
58
 
        for key, value in kwargs.iteritems():
59
 
            setattr(self, key, value)
60
 
    def __repr__(self):
61
 
        return "Company %s" % self.name
62
 
 
63
 
 
64
 
person_mapper = mapper(Person, people, polymorphic_on=people.c.type,
65
 
                       polymorphic_identity='person')
66
 
mapper(Engineer, engineers, inherits=person_mapper,
67
 
       polymorphic_identity='engineer')
68
 
mapper(Manager, managers, inherits=person_mapper,
69
 
       polymorphic_identity='manager')
70
 
 
71
 
mapper(Company, companies, properties={'employees'
72
 
       : relationship(Person, lazy='joined', backref='company',
73
 
       cascade='all, delete-orphan')})
74
 
 
75
 
engine = create_engine('sqlite://', echo=True)
76
 
 
77
 
metadata.create_all(engine)
78
 
 
79
 
session = sessionmaker(engine)()
80
 
 
81
 
c = Company(name='company1')
82
 
c.employees.append(Manager(name='pointy haired boss', status='AAB',
83
 
                   manager_name='manager1'))
84
 
c.employees.append(Engineer(name='dilbert', status='BBA',
85
 
                   engineer_name='engineer1', primary_language='java'))
86
 
c.employees.append(Person(name='joesmith', status='HHH'))
87
 
c.employees.append(Engineer(name='wally', status='CGG',
88
 
                   engineer_name='engineer2', primary_language='python'
89
 
                   ))
90
 
c.employees.append(Manager(name='jsmith', status='ABA',
91
 
                   manager_name='manager2'))
92
 
session.add(c)
93
 
 
94
 
session.commit()
95
 
 
96
 
c = session.query(Company).get(1)
97
 
for e in c.employees:
98
 
    print e, e._sa_instance_state.key, e.company
99
 
assert set([e.name for e in c.employees]) == set(['pointy haired boss',
100
 
        'dilbert', 'joesmith', 'wally', 'jsmith'])
101
 
print "\n"
102
 
 
103
 
dilbert = session.query(Person).filter_by(name='dilbert').one()
104
 
dilbert2 = session.query(Engineer).filter_by(name='dilbert').one()
105
 
assert dilbert is dilbert2
106
 
 
107
 
dilbert.engineer_name = 'hes dibert!'
108
 
 
109
 
session.commit()
110
 
 
111
 
c = session.query(Company).get(1)
112
 
for e in c.employees:
113
 
    print e
114
 
 
115
 
# illustrate querying using direct table access:
116
 
 
117
 
print session.query(Engineer.engineer_name).\
118
 
            select_from(engineers).\
119
 
            filter(Engineer.primary_language=='python').\
120
 
            all()
121
 
 
122
 
 
123
 
session.delete(c)
124
 
session.commit()
125