summaryrefslogtreecommitdiff
path: root/examples/large_collection
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-01-18 20:58:34 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2010-01-18 20:58:34 +0000
commit8a9e2a6c3783433c6b1c7c6a3d6ffd2cc7c1fd16 (patch)
tree17e8531ec6a46d33fb9fe5fb931e045d36647e40 /examples/large_collection
parent9680e6483f4a811e147dd75bf3f5ccab989f01e0 (diff)
downloadsqlalchemy-8a9e2a6c3783433c6b1c7c6a3d6ffd2cc7c1fd16.tar.gz
updated the large_collection example to modern SQLA.
Diffstat (limited to 'examples/large_collection')
-rw-r--r--examples/large_collection/__init__.py0
-rw-r--r--examples/large_collection/large_collection.py100
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