如何在Python中的SQL语句中使用变量?
好吧,所以我没有那种Python经验。
我有以下Python代码:
cursor.execute("INSERT INTO table VALUES var1, var2, var3,")
其中var1
是一个整数, var2
& var3
是字符串。
我如何在不使用python的情况下编写变量名称(包括它们作为查询文本的一部分)?
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
请注意,参数作为元组传递。
数据库API可以正确地转义和引用变量。 小心不要使用字符串格式操作符( %
),因为
Python DB-API的不同实现允许使用不同的占位符,所以你需要找出你正在使用哪一个 - 它可能是(例如MySQLdb):
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
或者(例如使用Python标准库中的sqlite3):
cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))
( VALUES
后可以有(:1, :2, :3)
或“命名样式” (:fee, :fie, :fo)
或(%(fee)s, %(fie)s, %(fo)s)
在那里你传递一个字典而不是地图作为第二个参数来execute
)。 检查你正在使用的DB API模块中的paramstyle
字符串常量,并在http://www.python.org/dev/peps/pep-0249/查找paramstyle,以查看所有参数传递样式是什么!
很多方法。 切勿使用最明显的一个( %s
与%
的实际代码),它是开放的攻击。
这里复制粘贴从sqlite3的pydoc :
# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
# Do this instead
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print c.fetchone()
# Larger example that inserts many records at a time
purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
('2006-04-06', 'SELL', 'IBM', 500, 53.00),
]
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)
更多的例子,如果你需要:
# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
链接地址: http://www.djcxy.com/p/71921.html