如何在Python3中将输入转义为MySQL数据库?

use*_*016 9 mysql sql python-3.x pymysql

如何在Python3中将输入转义为MySQL数据库?我正在使用PyMySQL并且工作正常,但是当我尝试做类似的事情时:

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` =  '{}'".format(request[1]))
Run Code Online (Sandbox Code Playgroud)

如果字符串有'或不起作用".我也尝试过:

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` =  %s",request[1])
Run Code Online (Sandbox Code Playgroud)

这个问题是库(PyMySQL)使用Python2.x的格式化语法%,它不再起作用了.我也发现了这种可能的解决方案

conn.escape_string()
Run Code Online (Sandbox Code Playgroud)

这里,但我不知道在哪里添加此代码.这就是我得到的:

import pymysql
import sys
conn = pymysql.connect( host   = "localhost",
            user   = "test",
            passwd = "",
            db     = "test")
cursor = conn.cursor()
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` =  {}".format(request[1]))

result = cursor.fetchall()

cursor.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)

编辑:我解决了!在PyMySQL中,正确的方法是这样的:

import pymysql
import sys
conn = pymysql.connect(host="localhost",
            user="test",
            passwd="",
            db="test")
cursor = conn.cursor()
text = conn.escape(request[1])
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` =  {}".format(text))

cursor.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)

text = conn.escape(request[1])行是什么逃脱的代码.在PyMySQL代码中找到它.那里request[1]是输入.

小智 27

虽然"已解决"的答案有效,但这不是最佳做法.使用符合Python DBI的库时,您应该使用绑定变量而不是格式化字符串并将其传递给执行.这种方法存在固有的危险.

因此,这是正确的方法:

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s", text)
Run Code Online (Sandbox Code Playgroud)

请注意,这不是格式字符串,而是传递给执行游标的绑定变量.

有关详细信息:Python DBI PEP

  • 请注意,即使对其他类型(例如整数)也应使用'%s'。我试图使用'%d'并收到错误:`%d format:需要数字,而不是str`。 (2认同)

use*_*016 3

解决了。在 PyMySQL 中,正确的方法是这样的:

import pymysql
import sys
conn = pymysql.connect(host="localhost",
            user="test",
            passwd="",
            db="test")
cursor = conn.cursor()
text = conn.escape(request[1])
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` =  {}".format(text))

cursor.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)

text = conn.escape(request[1])行是转义代码的地方。在 PyMySQL 代码中找到它。那里request[1]就是输入。

  • 直接使用 `.format` 是非常糟糕的做法 - @rootsmith 的答案是正确的方法,因为它可以清理。 (6认同)