python - python 列表中的 WHERE IN 子句

标签 python mysql

我需要在python中向mysql传递一批参数。这是我的代码:

sql = """ SELECT * from my_table WHERE name IN (%s) AND id=%(Id)s AND puid=%(Puid)s"""

params = {'Id':id,'Puid'  : pid}
in_p=', '.join(list(map(lambda x: '%s', names)))
sql = sql %in_p

cursor.execute(sql, names) #todo: add params to sql clause

问题是我想将名称列表传递给sql IN子句,同时我还想将id和puid作为参数传递给sql查询子句。我如何在 python 中实现这些?

最佳答案

考虑一下您想要的 cursor.execute 的参数。你想要最终执行

cursor.execute("SELECT * FROM my_table WHERE name IN (%s, %s, %s) AND id = %s AND puid = %s;", ["name1", "name2", "name3", id, pid])

你如何到达那里?棘手的部分是在 IN 子句中获取 %s 的可变数量。解决方案,正如您可能在 this answer 中看到的那样是动态构建它并将其%格式化为字符串。

in_p = ', '.join(list(map(lambda x: '%s', names)))
sql = "SELECT * FROM my_table WHERE name IN (%s) AND id = %s AND puid = %s;" % in_p

但这行不通。你得到:

TypeError: not enough arguments for format string

Python 似乎对后两个 %s 感到困惑,您不想替换它们。解决方案是告诉 Python 通过转义 % 来以不同方式对待这些 %s:

sql = "SELECT * FROM my_table WHERE name IN (%s) AND id = %%s AND puid = %%s;" % in_p

最后,构建参数并执行查询:

args = names + [id, pid]
cursor.execute(sql, args)

关于python - python 列表中的 WHERE IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36297511/

相关文章:

python - 如何在python中以大写字母更改单词的第i个字母?

mysql - 查找距离 map 上的点最近的分区

MySql COUNT(*) 返回 1 而不是 0

mysql - 使用 SSH 的 Laravel MySql 数据库连接

mysql - 在 MySQL 中为购物系统创建关系数据库

python - 如何在异步 Python 函数中指定返回类型?

Python 语言/语法用法

php - 插入触发器上的数据库 phpmyadmin

Python如何使用.pack作为其他显示器分辨率?

python - 即使我安装了请求的 MovieWriter (ffmpeg) 也不可用