djq*_*djq 1 python mysql sql database string-formatting
我正在使用MySQLdb将大量数据从文本文件上传到MySQL服务器.如果我手动准备一个字符串,这可以正常工作'as', '123', 12, 23,但我无法弄清楚如何循环一个列表来生成这个,因为我需要连接字符串和整数.
有效的insert语句示例如下:
""" INSERT INTO ACS(ST, CODE, BC001, BC002, BC003)
VALUES ('AK', '1234567', 20, 30, 40)"""
Run Code Online (Sandbox Code Playgroud)
这就是我试图从列表中生成此语句的方法:
import MySQLdb
# sample data
table = 'TestTable'
header = ['ST', 'CODE', 'BC001', 'BC002', 'BC003']
values = [['AA', '1234567', 20, 30, 40], ['BB', '1234567', 20, 30, 40], ['CC', '1234567', 20, 30, 40],['DD', '1234567', 20, 30, 40]]
# local SQL server on my computer
db = MySQLdb.connect (host = 'localhost', user = 'root', passwd = '', db = 'test')
# prepare a cursor object using cursor() method
cursor = db.cursor()
# header columns
sql1 = '('
for i in range(len(header)):
sql1 += header[i] + ','
sql1 = 'INSERT INTO ' + table + sql1[:-1] + ')'
# now loop through data values and combine with header each time
for i in range(len(values)):
sql2 = ''
for j in range(len(values[i])):
sql2 += values[i][j] + ',' #error occurs here
# structure: sql2 = """ VALUES ('AA', '1234567', 20, 30, 40)"""
sql2 = 'VALUES ' + table + sql2[:-1] + ')'
sql = sql1 + sql2
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
Run Code Online (Sandbox Code Playgroud)
我得到的错误信息是
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Run Code Online (Sandbox Code Playgroud)
我理解为什么会发生这种情况,但我无法想出另一种生成字符串的方法.有没有更好的方法来生产这些字符串?
我在Win7 64位上使用Python27.
MySQLdb可以在不必手动输入变量的情况下完成此操作.
你想做到这一点,因为MySQLdb会在某种程度上自动引用内容并防止SQL注入攻击.这在任何实际环境中都非常重要,如果您打算从事任何专业数据库工作,您应该习惯这一点.
使用MySQLdb游标对象,该execute()命令将自动格式化您的整数,字符串和其他变量,以便它们可以在您的INSERT语句中工作.他们使用一种特殊的格式字符串来完成此操作.
c=db.cursor()
max_price = 5
min_price = 1
c.execute("""SELECT spam, eggs, sausage FROM breakfast
WHERE price < %s AND price > %s""", (max_price, min_price))
Run Code Online (Sandbox Code Playgroud)
注意两件事:首先,所有变量,无论类型如何,都应该用这些特殊的格式字符串表示为%s.这就是它的工作方式.其次,第二个参数execute()应该是一个元组,所以如果你只有一个变量可以使用,你需要输入它(max_price,).括号末尾的逗号告诉python它是一个元组.