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解析器...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyTimer

转载于:https://www.cnblogs.com/Microshaoft/archive/2012/06/16/2552278.html

Dubbo的优化 --- 开发时使用

开发时的三个优化: 1、开发者在本地开发的时候启动Dubbo比较麻烦,所以采用直接连接的配置; 2、开发者本地开发时会打断点调试,会超过Dubbo默认的超时时间1s,所以需要全局设置超时时间; 3、开发者本地时可能…

MYSQL复制的几种模式

MYSQL复制的几种模式 MySQL 5.1 中,在复制方面的改进就是引进了新的复制技术:基于行的复制。MYSQL复制的几种模式 MySQL 5.1 中,在复制方面的改进就是引进了新的复制技术:基于行的复制。 简言之,这种新技术就是关注表中…

Code:目录

ylbtech-Code:目录1.返回顶部 1、https://github.com/2.返回顶部1、https://gitee.com2、3.返回顶部4.返回顶部5.返回顶部 6.返回顶部作者:ylbtech出处:http://ylbtech.cnblogs.com/本文版权归作者和博客园共有,欢迎转载&#xff…

微软系统修复工具(试用版)

Microsoft Fix it Center 使获得支持从未有过如此简单,因为自动疑难解 答程序将解决您的现有问题并防患于未然。 为您的设备定制了解决方案,仅显示与您的硬件 和软件相关的信息。 Microsoft Fix it Center 使您能轻松控制并支持您所有的设备。 下载地址…

java 会话共享_java – servlet如何工作?实例化,会话,共享变量和多线程

假设,我有一个拥有大量servlet的Web服务器.对于在这些servlet之间传递的信息,我正在设置会话和实例变量.现在,如果有2个或更多用户向此服务器发送请求,那么会话变量会发生什么?它们对所有用户都是通用的,或者对于每个用户而言都是不同的.如果它们不同,那么服务器如何…

Redis主从实战

为了提升redis高可用性,除了备份redis dump数据之外,还需要创建redis主从架构,可以利用从将数据库持久化,(我们所说的数据持久化将是将数据保存到写磁盘上,保证不会因为断电等因素丢失数据) Red…

java 基础面试 英文_[Java面试] 面试java基础总结大全

原标题:[Java面试] 面试java基础总结大全基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。java语言是跨平台,jvm不是跨平台的。JRE(Java Runtime Environment):ja…

在win7环境下使用网络无线共享把电脑变成一台无线路由器

视频教程: http://www.tudou.com/programs/view/PuWxjgYE2Sw/?frrec1&FRLIAN&refid7d145a79fe0ff49f 其中有几点的注意是要把网络设置为WEP、这样的通用性会广泛点、安全性会差点、看实际情况吧、可以先试试用WAP2加密方式、

Ubuntu下安装SSH服务

判断是否安装ssh服务,可以通过如下命令进行:$ ssh localhost ssh: connect to host localhost port 22: Connection refused 如上所示,表示没有还没有安装,可以通过apt安装,命令如下:apt-get install opens…

php字符串怎么传到html_php字符串函数(四):html与字符串之间的转换

* 1.addslashes($str):为了数据库查询语句等的需要在某些字符前加上了反斜线:单引号,双引号,反斜线,建议使用DBMS自带的:mysqli_real_escape_string()* 2.stripslashes($str):功能与addslashes()相反,去掉字符串中的转义反斜线字符* 3.htmlspecialchars($str,FLAG):将特殊字符转…

【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。http://blog.csdn.net/zhmxy555/article/details/7707628作者:毛星云 邮箱: happylifemxy163.com 期待着与志同道合的朋友们相互交流上一节里我们介绍了在迈入…

thinkphp省略php,ThinkPHP的截取字符串函数无法显示省略号的解决方法

对于ThinkPHP的截取字符串函数无法显示省略号的情况,解决方法如下:打开Common/extend.php页面,修改msubstr函数如下:function msubstr($str, $start0, $length, $charset"utf-8", $suffixtrue){if(function_exists(&quo…

Python Day 21 面向对象 (面向对象的三大特性(二)继承,多态,封装,几个装饰器函数)...

Python Day 21 面向对象 (面向对象的三大特性(二)继承,多态,封装,几个装饰器函数) https://mubu.com/doc/1AqL_M0IbW 继承之钻石继承 多态 封装 几个装饰器函数 classmethod 可以通过类使用被装饰的方法staticmethod …

将Fri May 04 17:25:34 CST 2012形式的日期字符串转换成java.util.Date对象的方法

java.util.Date类的toString()方法默认生成"Fri May 04 17:25:34 CST 2012"形式的字符串,但从这样的字符串生成java.util.Data对象却不那么自然,如下述代码 Date a new Date(); SimpleDateFormat sdf new SimpleDateFormat( "…

php webservice 上传,PHP实现WebService服务

第一步,安装PHP扩展SOAP并开启扩展,是否开启成功以phpinfo为准。第二步,创建服务端文件server.php{public functionhello(){return "Hello World!";}public function sum($num1,$num2){return $num1$num2;}}//创建 SoapServer 对象…

微信小程序小结(3) -- 使用wxParse解析html及多数据循环

wxParse-微信小程序富文本解析组件:https://github.com/icindy/wxParse 支持Html及markdown转wxml可视化 使用 1、copy下载好的文件夹wxParse - wxParse/-wxParse.js(必须存在)-html2json.js(必须存在)-htmlparser.js(必须存在)-showdown.js(必须存在)-wxDiscode.js…

简单实用的分页存储过程,支持多字段排序

CREATE PROCEDURE [dbo].[PublicSplitPage_sp] TableName varchar(8000), --表名 SqlStr varchar(8000)null, --查询语句 Condition varchar(8000), --查询条件 PageIndex int, --页所引,从0开始 PageSize int, --分页大…

php响应超过三十秒会报错么,如何捕捉致命错误:PHP中超过30秒的最大执行时间...

你唯一的select是增加允许的执行时间(将其设置为0使其无限,但不推荐)或产生一个新的线程,并希望最好的。这是不可捕捉的原因是它并没有真正抛出。 没有一行代码实际上触发了这个错误,而是PHP说:“不,不好意思&#xff…

前端代码标准最佳实践:javascript篇

前言 最近一直重构项目的前端代码,也参考了各种前端代码的最佳实践,目的是让前端的HTML,CSS,Javacript代码更符合标准,有更好的性能,更好的可维护性,尝到了重构后的甜头,也萌生了写这个系列博客的念头。前端…