Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

sqlalchemy i warunek na eagerload

1 view
Skip to first unread message

Paweł

unread,
Apr 28, 2008, 3:28:38 PM4/28/08
to
Witam!

Od jakiegoś czasu zacząłem używać sqlalchemy,
jednakże budując odrobinę bardziej 'skomplikowane' zapytania natrafiłem
na problem, którego nie potrafię rozwiązać.

Wycinek systemu:
t_materials = sa.Table('t_materials', meta.metadata,
...
)

class Material(object):
pass

orm.mapper(Material, t_materials, properties = {
'material_name':
orm.relation(MaterialName,
foreign_keys = [t_materials.c.mat_man_id],
primaryjoin =
t_materials.c.mat_man_id == t_material_names.c.man_id
)
})

t_material_names = sa.Table('t_material_names', meta.metadata,
...
)

class MaterialName(object):
pass

orm.mapper(MaterialName, t_material_names, properties = {
'producer':
orm.relation(Producer,
foreign_keys = [t_material_names.c.man_pro_id],
primaryjoin =
t_material_names.c.man_pro_id ==
t_producers.c.pro_id
)
})

Probuje teraz wykonac nastepujace zapytanie:
query = meta.Session.query(model.Material).options(
model.orm.eagerload('material_name'))

i tu w zasadzie dochodzimy do sedna:
W jaki sposob moge dodac warunki dla 'material_name' ?
probowalem .filter(model.Material.material_name.<nazwa_atrybutu> ...)
ale dostawalem komunikat w stylu InstrumentedAttribute does not contains
<nazwa atrybutu>

uzywajac debugera podejrzalem atrybuty material_name i znalazlem
sciezke: property.argument.<nazwa_atrybutu>
ale dajac warunek na ten atrybut uzyskalem selecta z dodatkowa tabela w
glownym FROM zapytania i warunku na nia a nie w LEFT OUTER JOIN
Mam nadzieje, ze w miare jasno udalo mi sie wyjasnic w czym problem...

Czy ktoś z szanownych grupowiczów zna rozwiązanie mojego problemu?
Podejrzewam, że dla osoby, która ma lepsze rozeznanie/doświadczenie w
sqlalchemy nie jest to nic trudnego...

Pozdrawiam
Paweł

Rob Wolfe

unread,
Apr 29, 2008, 8:23:52 AM4/29/08
to

Paweł napisał(a):
> Witam!
>
> Od jakiegos czasu zaczalem uzywac sqlalchemy,
> jednakze budujac odrobine bardziej 'skomplikowane' zapytania natrafilem
> na problem, ktorego nie potrafie rozwiazac.

[...]

> Probuje teraz wykonac nastepujace zapytanie:
> query = meta.Session.query(model.Material).options(
> model.orm.eagerload('material_name'))
>
> i tu w zasadzie dochodzimy do sedna:
> W jaki sposob moge dodac warunki dla 'material_name' ?
> probowalem .filter(model.Material.material_name.<nazwa_atrybutu> ...)
> ale dostawalem komunikat w stylu InstrumentedAttribute does not contains
> <nazwa atrybutu>
>

IMHO skoro uzywasz mappera, to powinienes sie poslugiwac istancjami
klasy `MaterialName` i jej atrybutami, czyli zapytanie by wygladalo
tak:

session.query(model.Material)).options(
model.orm.eagerload('material_name')).filter(
model.MaterialName.<nazwa_atrybutu>=='wartosc').all()

RW

0 new messages