python实现sql代码格式化,如何使用Python字符串格式化SQL IN子句

I am trying to create a statement as follows:

SELECT * FROM table WHERE provider IN ('provider1', 'provider2', ...)

However, I'm having some trouble with the string formatting of it from the Django API. Here's what I have so far:

profile = request.user.get_profile()

providers = profile.provider.values_list('provider', flat=True) # [u'provider1', u'provider2']

providers = tuple[str(item) for item in providers] # ('provider1', 'provider2')

SQL = "SELECT * FROM table WHERE provider IN %s"

args = (providers,)

cursor.execute(sql,args)

DatabaseError

(1241, 'Operand should contain 1 column(s)')

解决方案

MySQLdb has a method to help with this:

Doc

string_literal(...)

string_literal(obj) -- converts object obj into a SQL string literal.

This means, any special SQL characters are escaped, and it is enclosed

within single quotes. In other words, it performs:

"'%s'" % escape_string(str(obj))

Use connection.string_literal(obj), if you use it at all.

_mysql.string_literal(obj) cannot handle character sets.

Usage

# connection: <_mysql.connection open to at>

str_value = connection.string_literal(tuple(provider))

# '(\'provider1\', \'provider2\')'

SQL = "SELECT * FROM table WHERE provider IN %s"

args = (str_value,)

cursor.execute(sql,args)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值