python - 如何使用 Python 对 SQL IN 子句进行字符串格式化

标签 python mysql sql django

我正在尝试创建如下语句:

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

但是,我在使用 Django API 对其进行字符串格式化时遇到了一些问题。这是我到目前为止所拥有的:

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 有一个方法可以帮助解决这个问题:

文档

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.

用法

# connection:  <_mysql.connection open to 'localhost' at 1008b2420>

str_value = connection.string_literal(tuple(provider))
# '(\'provider1\', \'provider2\')'

SQL = "SELECT * FROM table WHERE provider IN %s"
args = (str_value,)
cursor.execute(sql,args) 

关于python - 如何使用 Python 对 SQL IN 子句进行字符串格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11195993/

相关文章:

python - 调用 ActionChains move_to_element() 会导致属性错误?

sql - 简单的数据库设计问题——测量集

python - 转换 DataFrame 中的每个组

python - 在tensorflow的keras的fit_generator中,AsyncResult在意外情况下挂起

mysql - 我无法使用 XAMPP 登录 MySQL

mysql - Sequelize - 插入长记录的最佳方式

sql - 具有递归的 CTE - row_number() 聚合

sql - Sequelize 外键引用复合主键

python - 如何在gae上使用python获取复选框数据

mysql - 在 Excel 中格式化 MySQL 数据