python - 组合sql查询中列表参数的正确格式
问题描述
我正在尝试使用连接列表作为参数执行 sql 查询。我已经建立了一个数据库连接,我想要一个类似的查询:
SELECT * FROM MYDATABASE.MY_TABLE
WHERE ( name IN ('name1','name2') );
所以我想将列表作为参数传递,变量过滤器是存储了正确格式但没有实际使用的变量。应该这样做的代码是:
my_list = ['name1', 'name2']
filters = ",".join(("'{}'".format(key) for key in my_list))
q = sql.SQL('''SELECT * FROM MYDATABASE.MY_TABLE WHERE ( name IN ({}) );''')
.format(sql.SQL(', ')
.join(sql.Placeholder() * len(my_list)))
cur = self.con.cursor()
query = q.as_string(context=self.con)
cur.execute(q)
results = cur.fetchall()
cur.close()
字符串查询是:
'SELECT * FROM MYDATABASE.MY_TABLE WHERE (name IN (%s, %s));'
,这似乎是正确的。
但是转义字符有一个错误,我找不到解决方法。
最后,我必须使用占位符而不是简单的
".... where name = {}".format() 解决方案,主要是出于安全原因。有什么帮助吗?
编辑:我尝试了所有建议,它们都给了我语法错误:
'错误:“,”或附近的语法错误
LINE 1: ....MY_TABLE WHERE (name IN (?,?))
.................... ..................................................... . ^'
解决方案
placeholder = '?'
placeholders = ', '.join(placeholder for unused in mylist)
query = "SELECT * FROM MYDATABASE.MY_TABLE WHERE (name IN (%s))" % placeholders
list = ",".join(my_list)
cursor.execute(query, list)
推荐阅读
- javascript - 如何在循环内创建具有唯一变量名的动态对象?
- java - 将 tinylog 与两个控制台编写器并行使用
- android - 在 WhatsApp 上共享数据无法在 android 11 上运行
- r - 需要找到关于回归模型的关系,但忽略 R 中的一些点
- regex - 如何在linux终端上替换多个文件中的一行?
- php - 在外部脚本 Moodle 中接收 303 错误代码
- elasticsearch - 我们可以在弹性搜索中优先考虑搜索索引的顺序吗
- ios - 如何防止ios通用链接在用户点击子域A页面中的url时打开APP,而url链接到子域B
- python - 你好,我的代码有问题,我做对了吗?
- python - 在python中合并和排序元组列表的有效方法