diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-01-18 20:58:34 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-01-18 20:58:34 +0000 |
| commit | 8a9e2a6c3783433c6b1c7c6a3d6ffd2cc7c1fd16 (patch) | |
| tree | 17e8531ec6a46d33fb9fe5fb931e045d36647e40 /examples/large_collection | |
| parent | 9680e6483f4a811e147dd75bf3f5ccab989f01e0 (diff) | |
| download | sqlalchemy-8a9e2a6c3783433c6b1c7c6a3d6ffd2cc7c1fd16.tar.gz | |
updated the large_collection example to modern SQLA.
Diffstat (limited to 'examples/large_collection')
| -rw-r--r-- | examples/large_collection/__init__.py | 0 | ||||
| -rw-r--r-- | examples/large_collection/large_collection.py | 100 |
2 files changed, 100 insertions, 0 deletions
diff --git a/examples/large_collection/__init__.py b/examples/large_collection/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/examples/large_collection/__init__.py diff --git a/examples/large_collection/large_collection.py b/examples/large_collection/large_collection.py new file mode 100644 index 000000000..4d98eed2b --- /dev/null +++ b/examples/large_collection/large_collection.py @@ -0,0 +1,100 @@ +"""Large collection example. + +Illustrates the options to use on relation() when the list of related objects +is very large. + +""" + +from sqlalchemy import (MetaData, Table, Column, Integer, String, ForeignKey, + create_engine) +from sqlalchemy.orm import (mapper, relation, sessionmaker) + + +meta = MetaData() + +org_table = Table('organizations', meta, + Column('org_id', Integer, primary_key=True), + Column('org_name', String(50), nullable=False, key='name'), + mysql_engine='InnoDB') + +member_table = Table('members', meta, + Column('member_id', Integer, primary_key=True), + Column('member_name', String(50), nullable=False, key='name'), + Column('org_id', Integer, ForeignKey('organizations.org_id', ondelete="CASCADE")), + mysql_engine='InnoDB') + + +class Organization(object): + def __init__(self, name): + self.name = name + +class Member(object): + def __init__(self, name): + self.name = name + +mapper(Organization, org_table, properties = { + 'members' : relation(Member, + # Organization.members will be a Query object - no loading + # of the entire collection occurs unless requested + lazy="dynamic", + + # Member objects "belong" to their parent, are deleted when + # removed from the collection + cascade="all, delete-orphan", + + # "delete, delete-orphan" cascade does not load in objects on delete, + # allows ON DELETE CASCADE to handle it. + # this only works with a database that supports ON DELETE CASCADE - + # *not* sqlite or MySQL with MyISAM + passive_deletes=True, + ) +}) + +mapper(Member, member_table) + +if __name__ == '__main__': + engine = create_engine("mysql://scott:tiger@localhost/test", echo=True) + meta.create_all(engine) + + # expire_on_commit=False means the session contents + # will not get invalidated after commit. + sess = sessionmaker(engine, expire_on_commit=False)() + + # create org with some members + org = Organization('org one') + org.members.append(Member('member one')) + org.members.append(Member('member two')) + org.members.append(Member('member three')) + + sess.add(org) + + print "-------------------------\nflush one - save org + 3 members\n" + sess.commit() + + # the 'members' collection is a Query. it issues + # SQL as needed to load subsets of the collection. + print "-------------------------\nload subset of members\n" + members = org.members.filter(member_table.c.name.like('%member t%')).all() + print members + + # new Members can be appended without any + # SQL being emitted to load the full collection + org.members.append(Member('member four')) + org.members.append(Member('member five')) + org.members.append(Member('member six')) + + print "-------------------------\nflush two - save 3 more members\n" + sess.commit() + + # delete the object. Using ON DELETE CASCADE + # SQL is only emitted for the head row - the Member rows + # disappear automatically without the need for additional SQL. + sess.delete(org) + print "-------------------------\nflush three - delete org, delete members in one statement\n" + sess.commit() + + print "-------------------------\nno Member rows should remain:\n" + print sess.query(Member).count() + + print "------------------------\ndone. dropping tables." + meta.drop_all(engine)
\ No newline at end of file |
