概述
这是一种不寻常的格式,仅由一些DBAPI支持,因为它将一个元组的元素作为单独的SQL表达式,包括它在表达式之间呈现逗号等,所以这样的语句就像执行(“select * from table where value in %s“,(somelist,))在数据库级别扩展为select * from表,其中(1,2,3)中的值.
SQLAlchemy不期待这种格式 – 它已经对输入参数进行了一些检查,因为它涉及将参数路由到DBAPI execute()或executemany()方法中,并且还接受几种不同的样式,并且这个结果转换就是这个元组被变平了.您可以通过添加一个元组来通过此解析潜入您的元组:
from sqlalchemy import create_engine
engine = create_engine("postgresql://scott:tiger@localhost/test", echo=True)
with engine.connect() as conn:
trans = conn.begin()
conn.execute("create table test (data integer)")
conn.execute(
"insert into test (data) values (%s)",
[(1, ), (2, ), (3, ), (4, ), (5, )]
)
result = conn.execute(
"select * from test where data in %s",
(
((1, 2, 3),),
)
)
print result.fetchall()
上述风格仅适用于某些DBAPI.一个快速测试证实它适用于psycopg2和MySQLdb,但不适用于sqlite3.它与DBAPI用于向数据库发送绑定参数的底层系统有关; psycopg2和MySQLdb都做Python字符串插值和自己的转义,但像cx_oracle这样的系统会将参数单独传递给OCI,所以这种事情在这种情况下是不行的.
SQLAlchemy在使用SQL表达式构造时提供了in_()运算符,但这并不适用于直线字符串.
最后
以上就是幸福大象为你收集整理的python能替代sql_python – SQLAlchemy使用IN子句进行原始SQL参数替换的全部内容,希望文章能够帮你解决python能替代sql_python – SQLAlchemy使用IN子句进行原始SQL参数替换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复