MySQL 参数化查询
我很难使用 MySQLdb 模块将信息插入我的数据库。 我需要在表中插入 6 个变量。
cursor.execute ("""
INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
VALUES
(var1, var2, var3, var4, var5, var6)
""")
有人可以帮我解决这里的语法吗?
I am having a hard time using the MySQLdb module to insert information into my database. I need to insert 6 variables into the table.
cursor.execute ("""
INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
VALUES
(var1, var2, var3, var4, var5, var6)
""")
Can someone help me with the syntax here?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
请注意在 SQL 查询中使用字符串插值,因为它不会正确转义输入参数,并且会使您的应用程序容易受到 SQL 注入漏洞的影响。 差异可能看起来微不足道,但实际上差异很大。
不正确(有安全问题)
正确(有转义)
SQL 语句中用于绑定参数的修饰符在不同的 DB API 实现之间有所不同,并且 mysql 客户端库使用
printf
样式语法,这增加了混乱而不是更普遍接受的“?” 标记(例如python-sqlite
使用)。Beware of using string interpolation for SQL queries, since it won't escape the input parameters correctly and will leave your application open to SQL injection vulnerabilities. The difference might seem trivial, but in reality it's huge.
Incorrect (with security issues)
Correct (with escaping)
It adds to the confusion that the modifiers used to bind parameters in a SQL statement varies between different DB API implementations and that the mysql client library uses
printf
style syntax instead of the more commonly accepted '?' marker (used by eg.python-sqlite
).您有几种选择。 您需要熟悉 Python 的字符串迭代。 当您将来想了解此类内容时,您可能会更成功地搜索这个术语。
更适合查询:
考虑到您可能已经将所有数据存储在对象或字典中,第二种格式更适合您。 另外,当您必须在一年内回来更新此方法时,必须计算字符串中“%s”的出现次数也很糟糕:)
You have a few options available. You'll want to get comfortable with python's string iterpolation. Which is a term you might have more success searching for in the future when you want to know stuff like this.
Better for queries:
Considering you probably have all of your data in an object or dictionary already, the second format will suit you better. Also it sucks to have to count "%s" appearances in a string when you have to come back and update this method in a year :)
链接的文档给出了以下示例:
因此,您只需将其调整为您自己的代码 - 例如:(
如果 SongLength 是数字,您可能需要使用 %d 而不是 %s)。
The linked docs give the following example:
So you just need to adapt this to your own code - example:
(If SongLength is numeric, you may need to use %d instead of %s).
实际上,即使您的变量 (SongLength) 是数字,您仍然需要使用 %s 对其进行格式化才能正确绑定参数。 如果您尝试使用 %d,您将收到错误。 这是此链接的一小段摘录 http://mysql-python.sourceforge.net/MySQLdb.html< /a>:
要执行查询,首先需要一个游标,然后可以对其执行查询:
在本例中,max_price=5 那么为什么要在字符串中使用%s呢? 因为MySQLdb会将其转换为SQL文字值,即字符串“5”。 完成后,查询实际上会显示“...WHERE 价格 < 5”。
Actually, even if your variable (SongLength) is numeric, you will still have to format it with %s in order to bind the parameter correctly. If you try to use %d, you will get an error. Here's a small excerpt from this link http://mysql-python.sourceforge.net/MySQLdb.html:
To perform a query, you first need a cursor, and then you can execute queries on it:
In this example, max_price=5 Why, then, use %s in the string? Because MySQLdb will convert it to a SQL literal value, which is the string '5'. When it's finished, the query will actually say, "...WHERE price < 5".
作为所选答案的替代方案,并且具有与 Marcel 相同的安全语义,这里是使用 Python 字典来指定值的紧凑方法。 它的优点是在添加或删除要插入的列时易于修改:
其中 meta 是保存要插入的值的字典。 可以用同样的方式进行更新:
As an alternative to the chosen answer, and with the same safe semantics of Marcel's, here is a compact way of using a Python dictionary to specify the values. It has the benefit of being easy to modify as you add or remove columns to insert:
Where meta is the dictionary holding the values to insert. Update can be done in the same way:
第一个解决方案效果很好。 我想在这里添加一个小细节。 确保您尝试替换/更新的变量必须是 str 类型。 我的 mysql 类型是十进制的,但我必须将参数变量设置为 str 才能执行查询。
The first solution works well. I want to add one small detail here. Make sure the variable you are trying to replace/update it will has to be a type str. My mysql type is decimal but I had to make the parameter variable as str to be able to execute the query.
这是另一种方法。 MySQL 官方网站上有说明。
https://dev.mysql。 com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html
从本质上讲,它使用了与 @Trey Stout 的答案相同的机制。 然而,我发现这个更漂亮并且更具可读性。
为了更好地说明对变量的任何需要:
注意:注意正在完成的转义。
Here is another way to do it. It's documented on the MySQL official website.
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html
In the spirit, it's using the same mechanic of @Trey Stout's answer. However, I find this one prettier and more readable.
And to better illustrate any need for variables:
NB: note the escape being done.