2012-07-06 50 views
7

Làm cách nào để thoát khỏi dữ liệu nhập vào một db MySQL trong Python3? Tôi đang sử dụng PyMySQL và hoạt động tốt, nhưng khi tôi cố gắng làm điều gì đó như:Làm cách nào để thoát khỏi dữ liệu nhập vào một db MySQL trong Python3?

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

nó sẽ không hoạt động nếu chuỗi có ' hoặc ". Tôi cũng đã cố gắng:

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

Vấn đề ở đây là các thư viện (PyMySQL) sử dụng cú pháp định dạng cho Python2.x, %, điều đó không có tác dụng nữa. Tôi cũng tìm thấy giải pháp khả thi này

conn.escape_string() 

trong here, nhưng tôi không biết nơi nào để thêm mã này. Đây là tất cả những gì tôi có:

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

Chỉnh sửa: Tôi đã giải quyết! Trong PyMySQL đúng cách là như thế này:

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

Trường hợp dòng text = conn.escape(request[1]) là những gì thoát khỏi mã. Tìm thấy nó bên trong mã PyMySQL. Ở đó, request[1] là đầu vào.

+1

Tuyệt. Tuy nhiên, bạn nên đăng một nửa câu hỏi của mình dưới dạng câu trả lời. Bạn có thể chấp nhận câu trả lời của riêng bạn. – Grilse

+0

Rất tiếc, tôi không thấy nút đó trước đây. – user1460016

+0

Nếu được giải quyết, hãy gắn cờ câu hỏi của riêng bạn khi được chấp nhận. :-) – Jocelyn

Trả lời

6

Đã giải quyết. Trong PyMySQL đúng cách là như thế này:

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

Trường hợp dòng text = conn.escape(request[1]) là những gì thoát khỏi mã. Tìm thấy nó bên trong mã PyMySQL. Ở đó, request[1] là đầu vào.

14

Mặc dù câu trả lời "đã giải quyết" hoạt động, nhưng đây không phải là phương pháp hay nhất. Khi sử dụng một thư viện phù hợp với Python DBI, bạn nên sử dụng các biến kết buộc thay vì định dạng một chuỗi và chuyển nó thành thực thi. Có những mối nguy hiểm vốn có trong phương pháp đó.

Vì vậy, đây là đúng cách để làm điều đó:

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

Lưu ý rằng đây không phải là một chuỗi định dạng nhưng một biến ràng buộc truyền cho con trỏ thực hiện.

Để biết chi tiết: Python DBI PEP

+0

Lưu ý rằng '% s' nên được sử dụng ngay cả với các loại khác nhau, chẳng hạn như số nguyên. Tôi đã cố gắng sử dụng '% d' và đã nhận được lỗi: '% d định dạng: một số là bắt buộc, không phải str'. – nephets

0

Sẵn sàng để sử dụng chức năng helper

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

dụ Cách sử dụng

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

tham khảo: https://github.com/PyMySQL/PyMySQL/blob/master/pymysql/cursors.py#L157-L158

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

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. 
Các vấn đề liên quan