【发布时间】:2020-05-14 05:31:56
【问题描述】:
这是我需要工作的最小代码示例(我们在 prod 中使用 mysql,我们喜欢原始 sql 查询用于复杂查询,因为数据分析师可以读取/修改/审核它们,我们使用 sqlite 进行单元测试)
from typing import List, Any
def test_sqlite_params_demo(self, session):
session.add(build_foo())
session.commit()
query = "select * from foo where id not in :id_list"
result = session.execute(query, {"id_list": [9, 99, 999]})
result_dict: List[Any] = [dict(r) for r in result]
assert len(result_dict) is 1
以下是上述导致的错误:
def do_execute(self, cursor, statement, parameters, context=None):
> cursor.execute(statement, parameters)
E sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "?": syntax error
E [SQL: select * from patient where id not in ?]
E [parameters: ([9, 99, 999],)]
E (Background on this error at: http://sqlalche.me/e/e3q8)
如果我使用元组而不是 result = session.execute(query, {"id_list": (9, 99, 999)}),则错误为:
> cursor.execute(statement, parameters)
E sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "?": syntax error
E [SQL: select * from foo where id not in ?]
E [parameters: ((9, 99, 999),)]
E (Background on this error at: http://sqlalche.me/e/e3q8)
注意:这个问题只发生在插入 list 而不仅仅是单个值时
我在 requirements.txt 文件中使用SQLAlchemy==1.3.11
现在我面临着在添加测试之前重写复杂代码(以不太理想的格式)或添加跳过/模拟我最想测试的代码部分的测试之间的不愉快选择。有什么更好的选择?
这个问题之前一定有人问过,但我一直没能找到。如果你知道它在哪里,请指点我:)
【问题讨论】:
标签: python mysql sqlite sqlalchemy