为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL参数化查询

MySQL参数化查询

狐的传说 2019-06-17 15:57:09
MySQL参数化查询我很难使用MySQLdb模块将信息插入到我的数据库中。我需要在表中插入6个变量。cursor.execute ("""     INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)     VALUES         (var1, var2, var3, var4, var5, var6) """)有谁能帮我解决这里的语法问题吗?
查看完整描述

5 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

小心在SQL查询中使用字符串插值,因为它不能正确地转义输入参数,并且会使应用程序容易受到SQL注入漏洞的影响。两者之间的差别似乎微不足道,但在现实中却是巨大的.

不正确(涉及安全问题)

c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s" % (param1, param2))

正确(带转义)

c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s", (param1, param2))

它增加了这样的混乱:用于绑定sql语句中的参数的修饰符在不同的DBAPI实现中和MySQL客户端库使用的不同。printf样式语法,而不是更普遍接受的‘?’标记(由例如。python-sqlite).


查看完整回答
反对 回复 2019-06-17
?
茅侃侃

TA贡献1842条经验 获得超21个赞

你有几个选择。您将希望能够适应python的字符串迭代。当你想知道这样的事情时,你可能会在未来的搜索中获得更多的成功。

更适合查询:

some_dictionary_with_the_data = {
    'name': 'awesome song',
    'artist': 'some band',
    etc...}cursor.execute ("""
            INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
            VALUES
                (%(name)s, %(artist)s, %(album)s, %(genre)s, %(length)s, %(location)s)

        """, some_dictionary_with_the_data)

考虑到您可能已经在一个对象或字典中拥有所有数据,第二种格式将更适合您。此外,当您必须返回并在一年内更新此方法时,必须计算字符串中的“%s”外观也很糟糕:)


查看完整回答
反对 回复 2019-06-17
?
青春有我

TA贡献1784条经验 获得超8个赞

链接的文档提供了以下示例:

   cursor.execute ("""
         UPDATE animal SET name = %s
         WHERE name = %s
       """, ("snake", "turtle"))
   print "Number of rows updated: %d" % cursor.rowcount

因此,您只需将其改编为您自己的代码-示例:

cursor.execute ("""
            INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
            VALUES
                (%s, %s, %s, %s, %s, %s)

        """, (var1, var2, var3, var4, var5, var6))

(如果Song Length是数字,则可能需要使用%d而不是%s)。


查看完整回答
反对 回复 2019-06-17
  • 5 回答
  • 0 关注
  • 1843 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信