# 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))
注意,参数是作为元组传递的。
数据库API对变量进行正确的转义和引用。注意不要使用字符串格式化运算符(
%
),因为很多方面。不要在实际代码中使用最明显的一个(
%s
和%
),它对attacks开放。这里复制粘贴:
更多示例(如果需要):
Python DB-API的不同实现允许使用不同的占位符,因此您需要找出正在使用的占位符--它可能是(例如,使用MySQLdb):
或者(例如,使用来自Python标准库的sqlite3):
或者其他(在
VALUES
之后,您可以有(:1, :2, :3)
,或者“命名样式”(:fee, :fie, :fo)
,或者(%(fee)s, %(fie)s, %(fo)s)
,在这里您传递dict而不是map作为execute
的第二个参数)。检查正在使用的DB API模块中的paramstyle
字符串常量,并在http://www.python.org/dev/peps/pep-0249/处查找paramstyle,查看所有的参数传递样式是什么!相关问题 更多 >
编程相关推荐