self._mapper_flush_opts = {}
if binds is not None:
- for mapperortable, value in binds.iteritems():
- if isinstance(mapperortable, type):
- mapperortable = _class_mapper(mapperortable).base_mapper
- self.__binds[mapperortable] = value
- if isinstance(mapperortable, Mapper):
- for t in mapperortable._all_tables:
- self.__binds[t] = value
+ for mapperortable, bind in binds.iteritems():
+ if isinstance(mapperortable, (type, Mapper)):
+ self.bind_mapper(mapperortable, bind)
+ else:
+ self.bind_table(mapperortable, bind)
if not self.autocommit:
self.begin()
"a binding.")
c_mapper = mapper is not None and _class_to_mapper(mapper) or None
-
+
# manually bound?
if self.__binds:
if c_mapper:
elif c_mapper.mapped_table in self.__binds:
return self.__binds[c_mapper.mapped_table]
if clause:
- for t in sql_util.find_tables(clause):
+ for t in sql_util.find_tables(clause, include_crud=True):
if t in self.__binds:
return self.__binds[t]
@engines.close_open_connections
@testing.resolve_artifact_names
- def test_table_binds_from_expression(self):
- """Session can extract Table objects from ClauseElements and match them to tables."""
+ def test_mapped_binds(self):
- mapper(Address, addresses)
- mapper(User, users, properties={
+ # ensure tables are unbound
+ m2 = sa.MetaData()
+ users_unbound =users.tometadata(m2)
+ addresses_unbound = addresses.tometadata(m2)
+
+ mapper(Address, addresses_unbound)
+ mapper(User, users_unbound, properties={
'addresses':relation(Address,
backref=backref("user", cascade="all"),
cascade="all")})
- Session = sessionmaker(binds={users: self.metadata.bind,
- addresses: self.metadata.bind})
+ Session = sessionmaker(binds={User: self.metadata.bind,
+ Address: self.metadata.bind})
sess = Session()
- sess.execute(users.insert(), params=dict(id=1, name='ed'))
- eq_(sess.execute(users.select(users.c.id == 1)).fetchall(),
- [(1, 'ed')])
+ u1 = User(id=1, name='ed')
+ sess.add(u1)
+ eq_(sess.query(User).filter(User.id==1).all(),
+ [User(id=1, name='ed')])
+
+ # test expression binding
+ sess.execute(users_unbound.insert(), params=dict(id=2, name='jack'))
+ eq_(sess.execute(users_unbound.select(users_unbound.c.id == 2)).fetchall(),
+ [(2, 'jack')])
- eq_(sess.execute(users.select(User.id == 1)).fetchall(),
- [(1, 'ed')])
+ eq_(sess.execute(users_unbound.select(User.id == 2)).fetchall(),
+ [(2, 'jack')])
+ sess.execute(users_unbound.delete())
+ eq_(sess.execute(users_unbound.select()).fetchall(), [])
+
sess.close()
@engines.close_open_connections
@testing.resolve_artifact_names
- def test_mapped_binds_from_expression(self):
- """Session can extract Table objects from ClauseElements and match them to tables."""
+ def test_table_binds(self):
- mapper(Address, addresses)
- mapper(User, users, properties={
+ # ensure tables are unbound
+ m2 = sa.MetaData()
+ users_unbound =users.tometadata(m2)
+ addresses_unbound = addresses.tometadata(m2)
+
+ mapper(Address, addresses_unbound)
+ mapper(User, users_unbound, properties={
'addresses':relation(Address,
backref=backref("user", cascade="all"),
cascade="all")})
- Session = sessionmaker(binds={User: self.metadata.bind,
- Address: self.metadata.bind})
+ Session = sessionmaker(binds={users_unbound: self.metadata.bind,
+ addresses_unbound: self.metadata.bind})
sess = Session()
- sess.execute(users.insert(), params=dict(id=1, name='ed'))
- eq_(sess.execute(users.select(users.c.id == 1)).fetchall(),
- [(1, 'ed')])
+ u1 = User(id=1, name='ed')
+ sess.add(u1)
+ eq_(sess.query(User).filter(User.id==1).all(),
+ [User(id=1, name='ed')])
+
+ sess.execute(users_unbound.insert(), params=dict(id=2, name='jack'))
+ eq_(sess.execute(users_unbound.select(users_unbound.c.id == 2)).fetchall(),
+ [(2, 'jack')])
+
+ eq_(sess.execute(users_unbound.select(User.id == 2)).fetchall(),
+ [(2, 'jack')])
- eq_(sess.execute(users.select(User.id == 1)).fetchall(),
- [(1, 'ed')])
+ sess.execute(users_unbound.delete())
+ eq_(sess.execute(users_unbound.select()).fetchall(), [])
sess.close()