14

如何在 Python3 中将输入转义到 MySQL 数据库?我正在使用 PyMySQL 并且工作正常,但是当我尝试执行以下操作时:

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

'如果字符串有or ,它将不起作用"。我也试过:

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

问题在于库(PyMySQL)使用 Python2.x, 的格式化语法%,这不再有效。我也找到了这个可能的解决方案

conn.escape_string()

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

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()

编辑:我解决了!在 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()

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

4

3 回答 3

35

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

因此,这是正确的做法:

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s", text)

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

详情:Python DBI PEP

于 2014-10-29T00:14:24.060 回答
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()

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

于 2012-07-07T12:47:37.003 回答
0

准备使用辅助函数

def mysql_insert(conn, table, row):
    cols = ', '.join('`{}`'.format(col) for col in row.keys())
    vals = ', '.join('%({})s'.format(col) for col in row.keys())
    sql = 'INSERT INTO `{0}` ({1}) VALUES ({2})'.format(table, cols, vals)
    conn.cursor().execute(sql, row)
    conn.commit()

使用示例

insert_into(conn, 'people', {
    'firstname': 'John',
    'lastname': 'Doe',
    'age': 18, })

参考:https ://github.com/PyMySQL/PyMySQL/blob/master/pymysql/cursors.py#L157-L158

def execute(self, query, args=None):

如果 args 是列表或元组,则 %s 可以用作查询中的占位符。
如果 args 是 dict,则 %(name)s 可以用作查询中的占位符。
于 2017-09-10T23:35:51.510 回答