python能替代sql_python – SQLAlchemy使用IN子句进行原始SQL参数替换

这是一种不寻常的格式,仅由一些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_()运算符,但这并不适用于直线字符串.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值