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
从列表中过滤为查询字符串 postgresql flask sqlalchemy [重复]
SQL ALCHEMY - 如何返回 query(model).all() 作为值的元组而不是模型实例