如何在Python的SQL语句中使用变量?

2020-12-04 08:44:09 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我对Python没什么经验。

我有以下Python代码:

cursor.execute("INSERT INTO table VALUES var1, var2, var3,")

其中var1是整数,var2&;var3是字符串。

如果python不将变量名作为查询文本的一部分,我如何编写变量名?

3条回答
网友
1楼 ·

很多方面。不要在实际代码中使用最明显的一个(%s%),它对attacks开放。

这里复制粘贴:

# 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))
网友
2楼 ·
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))

注意,参数是作为元组传递的。

数据库API对变量进行正确的转义和引用。注意不要使用字符串格式化运算符(%),因为

  1. 它不做任何转义或引用。
  2. 它容易受到不受控制的字符串格式攻击,例如SQL injection
网友
3楼 ·

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),在这里您传递dict而不是map作为execute的第二个参数)。检查正在使用的DB API模块中的paramstyle字符串常量,并在http://www.python.org/dev/peps/pep-0249/处查找paramstyle,查看所有的参数传递样式是什么!

相关问题