我正在尝试将SQL与Python中准备好的语句一起使用。Python对此没有自己的机制,因此我尝试直接使用SQL:
sql = "PREPARE stmt FROM ' INSERT INTO {} (date, time, tag, power) VALUES (?, ?, ?, ?)'".format(self.db_scan_table)
self.cursor.execute(sql)
然后,在循环中:
sql = "EXECUTE stmt USING \'{}\', \'{}\', {}, {};".format(d, t, tag, power)
self.cursor.execute(sql)
在循环中,我得到:
MySQL Error [1064]: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''2014-12-25', '12:31:46', 88000000, -6.64' at line 1
这是怎么回事?
例如,在http://zetcode.com/db/mysqlpython/上解释了如何在Python中使用MySQL准备好的语句-
在该页面中查找Prepared statements
。
在您的情况下,例如:
sql = ('INSERT INTO {} (date, time, tag, power) VALUES '
'(%s, %s, %s, %s)'.format(self.db_scan_table))
然后,将其放入循环中:
self.cursor.execute(sql, (d, t, tag, power))
无需进一步的字符串格式化-该MySQLdb
模块代表您执行准备和执行部件(并且可以缓存内容以避免不必要的重复工作等)。
根据您提到的“循环”的性质,请考虑考虑一次调用.execute_many
(用元组序列作为第二个参数)可以代替整个循环(除非您需要在其中进行更多处理)循环,而不仅仅是将数据插入数据库)。
补充:如今,更好的替代方法可能是在工厂中使用mysql自己Connector/Python
的显式prepare=True
选项.cursor()
-请参阅http://dev.mysql.com/doc/connector-
python/en/connector-python-api-
mysqlcursorprepared.html
。这使您可以使用一个特定的游标来准备语句(根据该mysql.com页面,该语句具有“比使用PREPARE和EXECUTE更有效”的二进制协议),而另一个则用于未准备好的语句。毕竟,“善于胜于隐含”
是 “ Python的禅宗”中的一项原则(import this
从交互式提示中阅读所有这些原则)。
mysqldb
隐式地做事(而且当前的开源版本 似乎没有 使用准备好的语句)不能像Connector/Python
更明确的架构那样好。
问题内容: 我在程序中尝试了准备好的语句,但是没有用。 注释的部分是“准备报表”部分。当我将其更改为常规语句时,一切都正确。 有人可以告诉我我想念什么吗? 非常感谢。 问题答案: 尝试从查询中删除并在添加参数后使用:
我将游标声明放在准备好的语句中,然后执行它,然后返回一个
问题内容: 嗨,我需要在我的网站中使用“准备好的声明”。我尝试使用这个 但这不起作用。当我改变并以它的工作。 问题答案: CodeIgniter不支持预备语句。如果查看CI的Database类的源代码,您将看到它们仅通过用传递的数组中的数据替换问号来解析绑定: https://github.com/EllisLab/CodeIgniter/blob/develop/system/database/
问题内容: 这个问题已经在这里有了答案 : 如何防止PHP中进行SQL注入? (28个答案) 6年前关闭。 我只是在学习数据库,我希望能够存储用户输入。如何使用PHP获取表单数据并将其保存到数据库的基本示例是什么? 也使表单免受SQL攻击。 问题答案: 文件 sample.html 文件 sample.php 这是一个非常基本的例子。今天,许多PHP开发人员都在转向PDO。Mysqli并不是过时的
问题内容: 这是我的Java JDBC代码(例如,经过修改和简化): 因为字符串中有圆括号,所以它不起作用。 如何在准备好的语句中转义括号? 编辑:根据我的回答(见下文),我确实提出了问题。 问题答案: 会回答自己-问题出在“〜”(波浪号)中。 经过详细阐述,有一个有趣的发现: 如果是SQL代码(请参见SQL代码中的“等号”): 无需转义。但是,如果这是SQL代码(请参见SQL代码中的“波浪号”标
问题内容: 我总是发现很难编写MySQLi预备语句,因为许多函数的工作方式与旧方法不同。现在我面临一个问题。 问题答案: 您正在尝试通过以下方式获取结果 事实并非如此。因为execute将仅返回布尔值。 做喜欢的。