python 列表 mysql in_关于mysql:内嵌要在python MySQLDB IN子句中使用的列表
我知道如何将列表映射到字符串:
foostring =",".join( map(str, list_of_ids) )
而且我知道我可以使用以下命令将该字符串放入IN子句中:
cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))
我需要使用MySQLDB安全地完成同一件事(避免SQL注入)。 在上面的示例中,由于foostring没有作为执行参数传递,因此它很容易受到攻击。 我还必须在mysql库之外引用和转义。
(有一个相关的SO问题,但是那里列出的答案对于MySQLDB无效或容易受到SQL注入的影响。)
您可能可以从php stackoverflow.com/questions/327274/中完成的类似问题中获得一些启发
SQL查询中python列表的可能重复项作为参数
@mluebke关于在查询中传递多个列表的任何想法吗?
直接使用list_of_ids:
format_strings = ','.join(['%s'] * len(list_of_ids))
cursor.execute("DELETE FROM foo.bar WHERE baz IN (%s)" % format_strings,
tuple(list_of_ids))
这样,您就不必引用自己的报价,并避免各种SQL注入。
请注意,数据(list_of_ids)作为参数(不在查询文本中)直接进入mysql的驱动程序,因此没有注入。您可以在字符串中保留所需的任何字符,而无需删除或引用字符。
为什么在format_strings中引用%s?也可以通过.execute()方法来处理吗?
@heikogerlach:我没有引用%s ...第一行创建了一个字符串"%s,%s,%s" ...的长度与list_of_ids长度相同。
啊,你说的对。需要更加努力。我莫名其妙地把它混合了。不错的解决方案。
在sqlite中也可以使用吗?因为我刚尝试过,它似乎指出了语法错误。
在sqlite中,@ Sohaib的替换字符是?而不是%s,因此如果将第一行更改为format_strings = ,.join(? * len(list_of_ids)),它将起作用。
是的,我做了一点研究就知道了。虽然感谢您的帮助:)
根据这样的语句与不同数量的参数一起使用的频率,我希望对参数编号进行分组并执行多个以确保数据库仅看到有限数量的变体(对于sql缓存)。这也有助于避免过多的参数。
您能否为Python3中的相同解决方案提供示例语法?
@nosklo如果使用的查询对象具有例如fname_list = [item1, item2] query = ("select distinct cln from vcf_commits where branch like %s and repository like %s and filename in (%s) and author not like %s" % format_strings,) cursor = churn_db_connection.get_connection_cursor() cursor.execute(query, (branch, repository, tuple(fname_list), invalid_author,))的参数,如何执行相同操作,则会引发错误
@kdas在您的情况下,您不希望% format_strings部分更改查询中的其他%s占位符,仅更改IN (%s)占位符-实现此目的的方法是将所有%字符加倍,除了所需的字符替换:query = ("select distinct cln from vcf_commits where branch like %%s and repository like %%s and filename in (%s) and author not like %%s" % format_strings,); cursor.execute(query, (branch, repository) + tuple(fname_list) + (invalid_author,))
啊,这真是棒极了@nosklo。 format_strings之后的逗号(,)引起错误,但删除后,它可以正常工作。天才。掌声。 query = ("select distinct cln from vcf_commits where branch like %%s and repository like %%s and filename in (%s) and author not like %%s" % format_strings);
尽管这个问题已经很老了,但最好还是留下一个答案,以防其他人在寻找我想要的东西
当我们有很多参数或想要使用命名参数时,可接受的答案会变得混乱
经过一番试验
ids = [5, 3, ...] # list of ids
cursor.execute('''
SELECT
...
WHERE
id IN %(ids)s
AND created_at > %(start_dt)s
''', {
'ids': tuple(ids), 'start_dt': '2019-10-31 00:00:00'
})
用python2.7,pymysql==0.7.11测试
如果使用Django 2.0 or 2.1和Python 3.6,这是正确的方法:
from django.db import connection
RESULT_COLS = ['col1', 'col2', 'col3']
RESULT_COLS_STR = ', '.join(['a.'+'`'+i+'`' for i in RESULT_COLS])
QUERY_INDEX = RESULT_COLS[0]
TABLE_NAME = 'test'
search_value = ['ab', 'cd', 'ef'] #
query = (
f'SELECT DISTINCT {RESULT_COLS_STR} FROM {TABLE_NAME} a '
f'WHERE a.`{RESULT_COLS[0]}` IN %s '
f'ORDER BY a.`{RESULT_COLS[0]}`;'
) #
with connection.cursor() as cursor:
cursor.execute(query, params=[search_value]) # params is a list with a list as its element
参考:https://stackoverflow.com/a/23891759/2803344
https://docs.djangoproject.com/zh-CN/2.1/topics/db/sql/#passing-parameters-into-raw
无痛MySQLdb execute('...WHERE name1 = %s AND name2 IN (%s)', value1, values2)
def execute(sql, *values):
assert sql.count('%s') == len(values), (sql, values)
placeholders = []
new_values = []
for value in values:
if isinstance(value, (list, tuple)):
placeholders.append(', '.join(['%s'] * len(value)))
new_values.extend(value)
else:
placeholders.append('%s')
new_values.append(value)
sql = sql % tuple(placeholders)
values = tuple(new_values)
# ... cursor.execute(sql, values)
list_of_ids = [ 1, 2, 3]
query ="select * from table where x in %s" % str(tuple(list_of_ids))
print query
如果您不希望使用必须传递参数以完成查询字符串的方法并且只想调用cursror.execute(query)的方法,则这在某些用例中可能会起作用。
另一种方法可能是:
"select * from table where x in (%s)" % ', '.join(str(id) for id in list_of_ids)
很简单:只需使用以下格式
rules_id = [" 9"," 10"]
sql1 =" SELECT * FROM Attenance_rules_staff WHERE id in(" +"," .join(map(str,rules_id))+")"
","。join(map(str,rules_id))
它在哪里进行sql引用,这不是使用文字而不是绑定变量吗?
不需要,它只是工作正常。您可以测试因为元组结构直接用第一个大括号(" 9"," 10")转换为字符串。哪个调整sql格式。因此,您不需要其他格式即可使sql可调整
并且rules_id是否包含"); DROP TABLES Bobby --?
已经告诉"内嵌列表"而不是")" ...因此在查询之前,您需要验证
或使用:sql1 =" SELECT * FROM Attenance_rules_staff WHERE id in(" +"," .join(map(str,rules_id))+")"
如果您坚持使用数字,我猜它很好,但是仍然会产生带有文字的SQL,糟糕的SQL解析器...
python 列表 mysql in_关于mysql:内嵌要在python MySQLDB IN子句中使用的列表相关推荐
- python调用so库 undefind symbol_内嵌Python import时undefined symbol错误及解决 | 学步园
内嵌Python import时undefined symbol错误及解决 以下代码 #include#include#includeintmain(intargc,char*argv[]) ...{ ...
- html内嵌框架怎么写,在HTML网页中,内嵌框架的标签代码是()。
在HTML网页中,内嵌框架的标签代码是(). 更多相关问题 每年人环奖的考试报名时间大约在5月份 嗅觉的香气包裹在闻气味的人周围,成为一种氛围,构成( )天空. Access的控件对象可以设置某个属性 ...
- mysql join 循环_关于mysql联表的内嵌循环操作nested loop join中on和where执行顺序问题...
mysql的理论依据没找到,个人理解是先执行where的过滤条件,先关联再过滤明显做的是无用功. oracle中倒是能在执行计划中看到,先执行的是过滤条件(下面代码中最后一行). explain pl ...
- python英文字符串排序_Python根据内嵌的数字将字符串排序(sort by numbers embedded in strings)...
标签: import re re_digits = re.compile(r'(\d+)') def embedded_numbers(s): pieces = re_digits.split(s) ...
- 标量函数,多语句表值函数,内嵌表值函数
标量函数返回一个标量(单值)结果,可返回Timestamp,text,Ntext,Image,Table,Cursor 多语句表值函数,返回一条或多条Transact-sql语句建立的表,可在sele ...
- 给妹子讲python-S01E19解析Python内嵌作用域与函数闭包
欢迎关注公众号:python数据科学家 [要点抢先看] 1.python中独特的嵌套函数 2.嵌套作用域与闭包现象 3.nonlocal关键字与内嵌作用域变量修改 前情回顾,上一节我们介绍了变量的LE ...
- python中闭包函数_Python的闭包问题(关于内嵌函数引用闭包函数的变量问题)
一.闭包: 记得:闭包的特性就是:内嵌函数会保存它引用的外围函数的变量值. 闭包概念:在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数和被引用的变量等 ...
- 【知识小课堂】 mongodb 之字段中的【 数组】、【内嵌文档】
一.介绍 MONGODB 的表结构 很灵活 .主要还是因为 字段中可以包含 [ 数组].[内嵌文档]. 现在简单介绍一下 字段中的[ 数组].[内嵌文档]相关的一些操作 (为了方便理解,还是以表来理解 ...
- creo配置文件config选项详解_5年资深架构师重点聚焦:SpringBoot的配置详解+内嵌Servlet容器
Spring Boot的配置详解 在本节中,我们将重点聚焦在Spring Boot的配置方面. 理解Spring Boot的自动配置 按照"约定大于配置"的原则,Spring Bo ...
最新文章
- 练习 假设性思维 和Mapping from vision to reality
- boost::intrusive::smart_ptr用法的测试程序
- 在 Linux 中查找和删除重复文件
- 使用NoSQLUnit测试Spring Data MongoDB应用程序
- 【Spring】入门HelloWorld
- python牛顿法计算平方根_常用的平方根算法详解与实现
- 11月1日至11日 全国处理快件47.76亿件
- Java如何封装参数_java规范(一)------方法设计---返回多参数的方法怎么封装
- DevexPress checkedit 多选解决方案(原创)
- java编写安卓计算器_Android计算器编写代码
- 计算机样式的ppt,计算机应基础使用样式修饰页面.ppt
- 详细Ubuntu 22.04 配置最新UR机械臂仿真环境(ros2-humble, ur-sim, ur-ros2-driver)
- 关于eclipse导入项目后架包找不到问题
- 第二类曲线、曲面积分计算公式
- 计算机与师范数学的联系论文,数学师范生毕业论文
- 深刻揭露步态识别的“谎言”(篇二:深度学习乱拳打进来)
- 无线网技术——复习(2)
- ArcGIS中对Feature的操作
- 振镜可以用计算机控制,振镜扫描式打标头
- el-table 表头自定义动态树形筛选框
热门文章
- nodejs的package.json依赖dependencies中 ^ 和 ~ 的区别
- mvn deploy 推送到私有仓库,注意当前日期
- My97DatePicker在asp.net项目中的使用
- Apache http强制转为https页面访问(转)
- [链接]Python中的metaclass、装饰器
- win7下开启和使用telnet的方法
- Insta360:从软到硬,一年做出360°全景相机,中间填了多少坑?
- kernel mtd 分区与UBOOT 分区的理解
- 计算机系统结构——概述
- HALCON示例程序forest.hdev识别森林中的树