【问题标题】:Pass variable into SQLAlchemy query将变量传递给 SQLAlchemy 查询
【发布时间】:2014-01-30 14:09:22
【问题描述】:

试图将一个变量(一个集合)传递给一个 sqlalchemy 查询。

找到这个:How can I bind a list to a parameter in a custom query in sqlalchemy? 但它需要你知道有很多项目。条目的数量在任何给定时刻都会发生变化。

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

基本上,我有这个变量:sites = set(db1).intersection(db2),我正在尝试将它传递给这个 sql alchemy 查询:

'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,))

【问题讨论】:

    标签: python sqlalchemy pyramid


    【解决方案1】:

    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()
    

    【讨论】:

      【解决方案2】:

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

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

      代替:

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

      【讨论】:

        猜你喜欢
        • 2015-05-19
        • 1970-01-01
        • 1970-01-01
        • 2019-02-16
        • 2016-12-19
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多