2014-01-30 77 views
0

尝试将变量(一组)传递到sqlalchemy查询中。将变量传递给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

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

假设你想加载学校的网站,你怎么样尝试:的

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

代替:

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