将变量传递给SQLAlchemy查询

时间:2014-01-30 14:09:23

标签: python sqlalchemy pyramid

尝试将变量(一组)传递给sqlalchemy查询。

发现这个:How can I bind a list to a parameter in a custom query in sqlalchemy?但它要求你知道很多物品。条目数在任何给定时刻都会发生变化。

不幸的是,我的previous question大部分未得到答复,所以我想我会重新尝试我在这里尝试做的事情。

基本上,我有这个变量:sites = set(db1).intersection(db2)而我正试图将它传递给这个sql炼金术查询:

'test': DBSession.query(A_School.cis_site_id.in_(sites)).all(),

但是我收到了invalid syntax个错误和invalid parameter type个错误...我无法按照我的意愿去做这件事。正如您可能猜到的,DB1和DB2是2个不同的数据库。

db1 = cis_db.query(site.site_id).join(site_tag).filter(site_tag.tag_id.like(202)).all()
db2 = DBSession.query(A_School.cis_site_id).all()

完整错误:

ProgrammingError: (ProgrammingError) ('Invalid parameter type.  param-index=0 param-type=KeyedTuple', 'HY105') u'SELECT [A_School].cis_site_id IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) AS anon_1 
FROM [A_School]' ((14639,), (14709,), (14587,), (14966,), (14625,), (14589,), (15144,), (15171,)  ... displaying 10 of 18 total bound parameter sets ...  (15133,), (14036,))

2 个答案:

答案 0 :(得分:2)

KeyedTuple是SQLAlchemy在不查询一个完整模型时返回的每一行的类型。您正在创建一组键控元组,而不是每个元组中单个值的集合。应该看起来像这样:

db1 = set(x.site_id for x in cis_db.query(site.site_id).join(site_tag).filter(site_tag.tag_id.like(202)))
db2 = set(x.cis_site_id for x in DBSession.query(A_School.cis_site_id))
sites = db1.intersection(db2)
test = DBSession.query(A_School).filter(A_School.cis_site_id.in_(sites)).all()

答案 1 :(得分:1)

假设您想为网站加载学校,请尝试:

DBSession.query(A_School).filter(A_School.cis_site_id.in_(sites)).all()

而不是:

DBSession.query(A_School.cis_site_id.in_(sites)).all()