def setup_query(self, context, entity, path, loadopt, adapter,
only_load_props=None, **kwargs):
+
if (
- loadopt and self.group and
+ (
+ loadopt and
+ 'undefer_pks' in loadopt.local_opts and
+ set(self.columns).intersection(self.parent.primary_key)
+ )
+ or
+ (
+ loadopt and
+ self.group and
loadopt.local_opts.get('undefer_group', False) == self.group
- ) or (only_load_props and self.key in only_load_props):
+ )
+ or
+ (
+ only_load_props and self.key in only_load_props
+ )
+ ):
self.parent_property._get_strategy_by_cls(ColumnLoader).\
setup_query(context, entity,
path, loadopt, adapter, **kwargs)
from sqlalchemy.orm import mapper, deferred, defer, undefer, Load, \
load_only, undefer_group, create_session, synonym, relationship, Session,\
joinedload, defaultload
-from sqlalchemy.testing import eq_, AssertsCompiledSQL
+from sqlalchemy.testing import eq_, AssertsCompiledSQL, assert_raises_message
from test.orm import _fixtures
from sqlalchemy.orm import strategies
"FROM orders WHERE orders.id = :param_1",
{'param_1':3})])
+ def test_defer_primary_key(self):
+ """what happens when we try to defer the primary key?"""
+
+ Order, orders = self.classes.Order, self.tables.orders
+
+
+ mapper(Order, orders, order_by=orders.c.id, properties={
+ 'id': deferred(orders.c.id)})
+
+ # right now, it's not that graceful :)
+ q = create_session().query(Order)
+ assert_raises_message(
+ sa.exc.NoSuchColumnError,
+ "Could not locate",
+ q.first
+ )
+
+
def test_unsaved(self):
"""Deferred loading does not kick in when just PK cols are set."""
"LEFT OUTER JOIN orders AS orders_1 ON users.id = orders_1.user_id"
)
- def test_load_only(self):
+ def test_load_only_no_pk(self):
orders, Order = self.tables.orders, self.classes.Order
mapper(Order, orders)
sess = create_session()
q = sess.query(Order).options(load_only("isopen", "description"))
self.assert_compile(q,
- "SELECT orders.description AS orders_description, "
+ "SELECT orders.id AS orders_id, "
+ "orders.description AS orders_description, "
"orders.isopen AS orders_isopen FROM orders")
+ def test_load_only_no_pk_rt(self):
+ orders, Order = self.tables.orders, self.classes.Order
+
+ mapper(Order, orders)
+
+ sess = create_session()
+ q = sess.query(Order).order_by(Order.id).\
+ options(load_only("isopen", "description"))
+ eq_(q.first(), Order(id=1))
+
def test_load_only_w_deferred(self):
orders, Order = self.tables.orders, self.classes.Order
)
self.assert_compile(q,
"SELECT orders.description AS orders_description, "
+ "orders.id AS orders_id, "
"orders.user_id AS orders_user_id, "
"orders.isopen AS orders_isopen FROM orders")
)
self.assert_compile(q,
- "SELECT users.name AS users_name, orders.id AS orders_id, "
+ "SELECT users.id AS users_id, users.name AS users_name, "
+ "orders.id AS orders_id, "
"addresses.id AS addresses_id, addresses.email_address "
"AS addresses_email_address FROM users, orders, addresses"
)
# hmmmm joinedload seems to be forcing users.id into here...
self.assert_compile(
q,
- "SELECT users.name AS users_name, users.id AS users_id, "
+ "SELECT users.id AS users_id, users.name AS users_name, "
"addresses_1.id AS addresses_1_id, "
"addresses_1.email_address AS addresses_1_email_address, "
"orders_1.id AS orders_1_id FROM users "