Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不是';t连接器/Python执行器可以优化插入吗?_Python_Mysql_Connector_Mysql Connector Python_Executemany - Fatal编程技术网

为什么不是';t连接器/Python执行器可以优化插入吗?

为什么不是';t连接器/Python执行器可以优化插入吗?,python,mysql,connector,mysql-connector-python,executemany,Python,Mysql,Connector,Mysql Connector Python,Executemany,我正在使用Connector/Python在mysql中向临时表中插入许多行。这些行都在列表列表中。我按如下方式执行插入: cursor = connection.cursor(); batch = [[1, 'foo', 'bar'],[2, 'xyz', 'baz']] cursor.executemany('INSERT INTO temp VALUES(?, ?, ?)', batch) connection.commit() 我注意到(当然还有更多的行)性能非常差。使用ShowPro

我正在使用Connector/Python在mysql中向临时表中插入许多行。这些行都在列表列表中。我按如下方式执行插入:

cursor = connection.cursor();
batch = [[1, 'foo', 'bar'],[2, 'xyz', 'baz']]
cursor.executemany('INSERT INTO temp VALUES(?, ?, ?)', batch)
connection.commit()

我注意到(当然还有更多的行)性能非常差。使用ShowProcessList,我注意到每个插入都是单独执行的。但是文档说这应该优化为1个插入。发生了什么事?

回答,这样其他人就不会经历我不得不进行的调试了

我在代码中的其他查询上编写了查询模型,这些查询使用准备好的语句并使用“?”来指示参数。但是你不能为ExecuteMy()这样做!它必须使用“%s”。改为:

cursor.executemany('INSERT INTO temp VALUES(%s,%s,%s)', batch)
…使速度提高了百倍,并且可以使用ShowProcessList查看优化的单个查询。注意标准的“?”语法

尝试打开此命令: cursor.fast\u executemany=True


否则,如果使用
IGNORE
类似于
cursor,则executemany的行为就像多重执行一样。executemany('INSERT IGNORE INTO temp value(%s,%s,%s)',batch)
executemany()
的行为就像多重执行一样

在大多数情况下,您仍然应该使用准备好的语句来避免SQL注入。mysql中还内置了许多其他机制来促进批量插入。最显著的是加载数据填充,这将比您的执行速度快得多many@e4c5有问题的陈述引述正确。我不确定海报使用了什么,但%s没有?是整个mysql连接器游标api的值占位符。这正是我要说的。我现在知道%s是正确的占位符,但这只是因为“?”没有优化,而不是因为它不起作用?很好用。这就是调试的巨大痛苦所在。我是说,为了安全,你应该牺牲速度增益,因为有更快的方法导入大量数据。这与安全无关。这不是字符串格式,这些是占位符。“此方法执行给定的数据库操作(查询或命令)。在元组或字典参数中找到的参数将绑定到操作中的变量。使用%s或%(name)s参数样式(即,使用format或pyformat样式)指定变量。如果multi为真,则execute()返回迭代器。”?游标api中的占位符。然而,该语句与“?”一起工作100%良好。我之所以使用它,是因为其他开发人员在现有代码中使用了它。这有点奇怪,api本身支持各种占位符,也许某个地方的一些通用功能正在捕捉它们?无论哪种方式,您都可以在mysql connector中实际查询占位符的实现本身,您应该始终使用%s或命名的参数。是的,现在我明白了,但我不是唯一一个碰到这个问题的人。我知道%s是正确的占位符,但我看到所有这些代码都在使用?而且工作很好。唯一的问题是executemany()的优化。我只是希望帮助一些人解决这个问题“天哪,使用问号占位符很好,除了executemany()没有做我想做的”。你会看到人们在python中到处使用问号占位符。
cursor.fast\u executemany
是pyodbc的一个特性。这个问题是关于MySQL连接器/Python的。