mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-06-01 05:18:44 -04:00
065fcbd9d2
relationship(), to eliminate confusion over the relational algebra term. relation() however will remain available in equal capacity for the foreseeable future. [ticket:1740]
94 lines
2.8 KiB
Python
94 lines
2.8 KiB
Python
import testenv; testenv.simple_setup()
|
|
from sqlalchemy import *
|
|
from sqlalchemy.orm import *
|
|
from timeit import Timer
|
|
import sys
|
|
|
|
|
|
meta = MetaData()
|
|
|
|
orders = Table('orders', meta,
|
|
Column('id', Integer, Sequence('order_id_seq'), primary_key = True),
|
|
)
|
|
items = Table('items', meta,
|
|
Column('id', Integer, Sequence('item_id_seq'), primary_key = True),
|
|
Column('order_id', Integer, ForeignKey(orders.c.id), nullable=False),
|
|
)
|
|
attributes = Table('attributes', meta,
|
|
Column('id', Integer, Sequence('attribute_id_seq'), primary_key = True),
|
|
Column('item_id', Integer, ForeignKey(items.c.id), nullable=False),
|
|
)
|
|
values = Table('values', meta,
|
|
Column('id', Integer, Sequence('value_id_seq'), primary_key = True),
|
|
Column('attribute_id', Integer, ForeignKey(attributes.c.id), nullable=False),
|
|
)
|
|
|
|
class Order(object): pass
|
|
class Item(object): pass
|
|
class Attribute(object): pass
|
|
class Value(object): pass
|
|
|
|
valueMapper = mapper(Value, values)
|
|
attrMapper = mapper(Attribute, attributes, properties=dict(
|
|
values=relationship(valueMapper, cascade="save-update", backref="attribute")
|
|
))
|
|
itemMapper = mapper(Item, items, properties=dict(
|
|
attributes=relationship(attrMapper, cascade="save-update", backref="item")
|
|
))
|
|
orderMapper = mapper(Order, orders, properties=dict(
|
|
items=relationship(itemMapper, cascade="save-update", backref="order")
|
|
))
|
|
|
|
|
|
|
|
class TimeTrial(object):
|
|
|
|
def create_fwd_assoc(self):
|
|
item = Item()
|
|
self.order.items.append(item)
|
|
for attrid in range(10):
|
|
attr = Attribute()
|
|
item.attributes.append(attr)
|
|
for valueid in range(5):
|
|
val = Value()
|
|
attr.values.append(val)
|
|
|
|
def create_back_assoc(self):
|
|
item = Item()
|
|
item.order = self.order
|
|
for attrid in range(10):
|
|
attr = Attribute()
|
|
attr.item = item
|
|
for valueid in range(5):
|
|
val = Value()
|
|
val.attribute = attr
|
|
|
|
def run(self, number):
|
|
s = create_session()
|
|
self.order = order = Order()
|
|
s.save(order)
|
|
|
|
ctime = 0.0
|
|
timer = Timer("create_it()", "from __main__ import create_it")
|
|
for n in xrange(number):
|
|
t = timer.timeit(1)
|
|
print "Time to create item %i: %.5f sec" % (n, t)
|
|
ctime += t
|
|
|
|
assert len(order.items) == 10
|
|
assert sum(len(item.attributes) for item in order.items) == 100
|
|
assert sum(len(attr.values) for item in order.items for attr in item.attributes) == 500
|
|
assert len(s.new) == 611
|
|
print "Created 610 objects in %.5f sec" % ctime
|
|
|
|
if __name__ == "__main__":
|
|
tt = TimeTrial()
|
|
|
|
print "\nCreate forward associations"
|
|
create_it = tt.create_fwd_assoc
|
|
tt.run(10)
|
|
|
|
print "\nCreate backward associations"
|
|
create_it = tt.create_back_assoc
|
|
tt.run(10)
|