【问题标题】:SQLAlchemy and RAW SQL: List as an inputSQLAlchemy 和 RAW SQL:列表作为输入
【发布时间】:2015-02-23 17:25:49
【问题描述】:

我正在使用 Flask-SQLAlchemy,但我在 SQL 语法中的 IN 子句上遇到了一些问题。我希望我的 IN 子句“读取”的数据是一个包含一些数据的列表,例如

args = [1, 2, 3]

这是我的代码的样子。

connection = db.session.connection()
raw_sql = text("""
        SELECT
          *
        FROM 
         table
        WHERE data IN :list
        """)
query = connection.engine.execute(raw_sql, {'list' : args})

我尝试将插入元组和列表赋予 args 参数,但没有任何效果。我要么得到:

  • Python 'tuple' 无法转换为带有args = tuple([1, 2, 3]) 的 MySQL 类型
  • 使用args = [1, 2, 3] 时,Python 'list' 无法转换为 MySQL 类型


您如何使用 SQLAlchemy 从列表中读取数据并使用 RAW SQL 和参数作为输入?

【问题讨论】:

标签: python mysql flask sqlalchemy flask-sqlalchemy


【解决方案1】:

在 python 3.7 上:

import sqlalchemy

args = [1, 2, 3]
raw_sql = "SELECT * FROM table WHERE data IN :values" 
query = sqlalchemy.text(raw_sql).bindparams(values=tuple(args))
conn.engine.execute(query)

【讨论】:

    【解决方案2】:

    你应该试试这个方法:

    args = [1, 2, 3]
    raw_sql = "SELECT * FROM table WHERE data IN %s" 
    params = [(args,)] # the comma allows to convert the list into a tuple
    conn.engine.execute(raw_sql, params)
    

    【讨论】:

    • 您好@Jivan,感谢您的回答,但恐怕将其转换为字符串不起作用。我收到 MySQL 错误代码:1064。即使我在 MySQL Workbench 中尝试 SQL 语法。我遇到了同样的错误。它不允许我写 IN "(1, 2, 3)" 或 IN '(1, 2, 3)',如果我删除 str 方法,我仍然会遇到同样的错误! 我还在 MySQL Workbench 中强调了“”是一个 SQL 语法错误
    • @Sigils 好的,我找到了另一种方法。刚刚编辑了我的答案以反映这一点。
    • 我很抱歉,但这都没有用。我很高兴你能花时间帮助我。但我现在得到的错误是AttributeError: 'list' object has no attribute 'keys'。如果这很重要,我正在使用 python 3.4?是的,我确实写了你是怎么做的!也许我应该用 ORM 而不是 RAW SQL 来编写它?
    • @Sigils 你在哪一行得到你的AttributeError
    • 我正在使用 WSGI 应用程序来显示错误。没有收到任何线路错误。但最后一个回溯错误是keys = distilled_params[0].keys() SQLAlchemy 的内置代码
    猜你喜欢
    • 2018-09-01
    • 2011-10-17
    • 2012-01-23
    • 2018-06-18
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多