2012-07-06 57 views
7

如何在Python3中将输入转换为MySQL数据库? 我使用PyMySQL和工作正常,但是当我尝试做一些事情,如:如何在Python3中将输入转换为MySQL数据库?

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

如果字符串'"将无法​​正常工作。我也试过:

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

这样做的问题是库(PyMySQL)用来Python2.x,%格式语法,不工作了。 我也发现了这个可能的解决方案

conn.escape_string() 

here,但我不知道在哪里可以添加此代码。 这就是我的一切:

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]是输入。

+1

很酷。不过,您应该将问题的后半部分作为答案发布。你可以接受你自己的答案。 – Grilse 2012-07-07 03:24:35

+0

糟糕,我以前没看到那个按钮。 – user1460016 2012-07-07 12:48:29

+0

如果解决,然后标记自己的问题被接受。 :-) – Jocelyn 2012-07-07 12:53:03

回答

6

已解决。在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]是输入。

14

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

因此,这是做正确的方式:

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

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

详情:Python DBI PEP

+0

请注意,'%s'应该用于不同的类型,例如整数。我试图使用'%d'并得到错误:'%d格式:需要一个数字,而不是str'。 – nephets 2015-09-09 18:48:12

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

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. 
相关问题