[ticket:970]
- orm
+ - The "foreign_keys" argument of relation() will now propagate
+ automatically to the backref in the same way that primaryjoin
+ and secondaryjoin do. For the extremely rare use case where
+ the backref of a relation() has intentionally different
+ "foreign_keys" configured, both sides now need to be
+ configured explicity (if they do in fact require this setting,
+ see the next note...).
+
+ - ...the only known (and really, really rare) use case where a
+ different foreign_keys setting was used on the
+ forwards/backwards side, a composite foreign key that
+ partially points to its own columns, has been enhanced such
+ that the fk->itself aspect of the relation won't be used to
+ determine relation direction.
+
- Session.mapper is now *deprecated*.
Call session.add() if you'd like a free-standing object to be
http://www.sqlalchemy.org/trac/wiki/UsageRecipes/SessionAwareMapper
The method will remain deprecated throughout 0.6.
- - Fixed bug introduced in 0.5.4 whereby Composite types fail
- when default-holding columns are flushed.
+ - Fixed Query being able to join() from individual columns of a
+ joined-table subclass entity, i.e. query(SubClass.foo,
+ SubcClass.bar).join(<anything>). In most cases, an error
+ "Could not find a FROM clause to join from" would be
+ raised. In a few others, the result would be returned in terms
+ of the base class rather than the subclass - so applications
+ which relied on this erroneous result need to be
+ adjusted. [ticket:1431]
- Fixed a bug involving contains_eager(), which would apply
itself to a secondary (i.e. lazy) load in a particular rare
case, producing cartesian products. improved the targeting of
query.options() on secondary loads overall [ticket:1461].
+ - Fixed bug introduced in 0.5.4 whereby Composite types fail
+ when default-holding columns are flushed.
+
- Fixed another 0.5.4 bug whereby mutable attributes
(i.e. PickleType) wouldn't be deserialized correctly when the
whole object was serialized. [ticket:1426]
placed back in a session would not be fully garbage collected
unless the Session were explicitly closed out.
- - Fixed Query being able to join() from individual columns of a
- joined-table subclass entity, i.e. query(SubClass.foo,
- SubcClass.bar).join(<anything>). In most cases, an error
- "Could not find a FROM clause to join from" would be
- raised. In a few others, the result would be returned in terms
- of the base class rather than the subclass - so applications
- which relied on this erroneous result need to be
- adjusted. [ticket:1431]
-
- Fixed bug whereby list-based attributes, like pickletype and
PGArray, failed to be merged() properly.
- - The "foreign_keys" argument of relation() will now propagate
- automatically to the backref in the same way that primaryjoin
- and secondaryjoin do. For the extremely rare use case where
- the backref of a relation() has intentionally different
- "foreign_keys" configured, both sides now need to be
- configured explicity (if they do in fact require this setting,
- see the next note...).
-
- - ...the only known (and really, really rare) use case where a
- different foreign_keys setting was used on the
- forwards/backwards side, a composite foreign key that
- partially points to its own columns, has been enhanced such
- that the fk->itself aspect of the relation won't be used to
- determine relation direction.
-
- Repaired non-working attributes.set_committed_value function.
- Trimmed the pickle format for InstanceState which should
format should be backwards compatible with that of 0.5.4 and
previous.
+ - sqlalchemy.orm.join and sqlalchemy.orm.outerjoin are now
+ added to __all__ in sqlalchemy.orm.*. [ticket:1463]
+
+ - Fixed bug where Query exception raise would fail when
+ a too-short composite primary key value were passed to
+ get(). [ticket:1458]
+
- sql
- Removed an obscure feature of execute() (including connection,
engine, Session) whereby a bindparam() construct can be sent
from test.orm._fixtures import keywords, addresses, Base, Keyword, FixtureTest, \
Dingaling, item_keywords, dingalings, User, items,\
orders, Address, users, nodes, \
- order_items, Item, Order, Node
+ order_items, Item, Order, Node, \
+ composite_pk_table, CompositePk
from test.orm import _base
)
})
+ mapper(CompositePk, composite_pk_table)
+
compile_mappers()
class RowTupleTest(QueryTest):
u2 = s.query(User).get(7)
assert u is not u2
+ def test_get_composite_pk(self):
+ s = create_session()
+ assert s.query(CompositePk).get((100,100)) is None
+ one_two = s.query(CompositePk).get((1,2))
+ assert one_two.i == 1
+ assert one_two.j == 2
+ assert one_two.k == 3
+ q = s.query(CompositePk)
+ assert_raises(sa_exc.InvalidRequestError, q.get, 7)
+
+
def test_no_criterion(self):
"""test that get()/load() does not use preexisting filter/etc. criterion"""