【问题标题】:session.execute() IN operator of SQLAlchemysession.execute() SQLAlchemy 的 IN 运算符
【发布时间】:2017-11-11 06:02:35
【问题描述】:

当我尝试执行这个简单的请求时遇到了一个问题:

params['_filter_items'] = (12345)

sql = """ SELECT * FROM items
          WHERE items.items IN %(_filter_items)s"""
# session is a db session of sqlAlchemy
query = session.execute(sql % params)

它会生成:

SELECT * FROM items
WHERE items.items IN 12345

没有 () 当我有不止一件物品时,没关系; 我可以触摸请求;但我想知道是否有其他方法可以解决它。

【问题讨论】:

  • 12345 应该是字符串还是整数?
  • 还有(12345)12345一样,括号是多余的,如果你想生成单元素元组你应该写(12345,)(加逗号)
  • 整型是表的主键
  • 最后:您应该避免使用% 插入参数,将它们作为参数传递给execute,如session.execute(sql, params)
  • 谢谢我已经尝试过了,但它在 PosgreSQL 中不起作用。 items.item_id IN (142661089,) ProgrammingError: (psycopg2.ProgrammingError) 语法错误在“)”处或附近,完全用逗号表示

标签: python sqlalchemy pyramid


【解决方案1】:

代码行 params['_filter_items'] = (12345) 由 Python 解释器解析为 params['_filter_items'] = 12345。这意味着在您的代码(12345) 中它是int,而不是tuple。要使用元组,您必须编写 params['_filter_items'] = (12345, )

【讨论】:

    【解决方案2】:
    • 这个对象

      (12345)
      

      一样
      12345
      

      但看起来你需要 tuple 和单个元素 12345,可以用逗号完成

      (12345,)
      
    • 我们应该避免自己插入参数:

      session.execute(sql % params)
      

      让我们将这项工作委托给SQLAlchemy 和数据库驱动程序,并将参数作为参数传递给execute

      session.execute(sql, params)
      

    试试

    params['_filter_items'] = (12345,)
    
    sql = """ SELECT * FROM items
              WHERE items.items IN %(_filter_items)s"""
    # session is a db session of sqlAlchemy
    query = session.execute(sql, params)
    

    【讨论】:

      【解决方案3】:

      您应该查看SQLAlchemy in clause,以了解更安全的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-15
        • 2012-05-10
        • 2019-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多