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

问题描述 投票:8回答:3

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

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

如果字符串有'",它将无法工作。我也尝试过:

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

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

%

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

here

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

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

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() 线是逃脱代码的地方。在PyMySQL代码中找到它。在那里,text = conn.escape(request[1])是输入。

mysql sql python-3.x pymysql
3个回答
27
投票

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

因此,这是正确的方法:

request[1]

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

有关详细信息:cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s", text)


3
投票

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

Python DBI PEP

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() 线是逃脱代码的地方。在PyMySQL代码中找到它。在那里,text = conn.escape(request[1])是输入。


-1
投票

准备使用辅助功能

request[1]

用法示例

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

If args is a list or tuple, %s can be used as a placeholder in the query.
If args is a dict, %(name)s can be used as a placeholder in the query.
© www.soinside.com 2019 - 2024. All rights reserved.