SQLAlchemy 和 RAW SQL:列表作为输入

Posted

技术标签:

【中文标题】SQLAlchemy 和 RAW SQL:列表作为输入【英文标题】:SQLAlchemy and RAW SQL: List as an input 【发布时间】: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 和参数作为输入?

【问题讨论】:

这能回答你的问题吗? How can I bind a list to a parameter in a custom query in 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 的内置代码

以上是关于SQLAlchemy 和 RAW SQL:列表作为输入的主要内容,如果未能解决你的问题,请参考以下文章

如何使用SQLAlchemy库写出防SQL注入的Raw SQL

sqlalchemy 的 raw sql 方式使用示例

从列表中过滤为查询字符串 postgresql flask sqlalchemy [重复]

SQL ALCHEMY - 如何返回 query(model).all() 作为值的元组而不是模型实例

SQLAlchemy中的PostgreSQL RAW查询[重复]

在 sqlalchemy 中执行存储过程