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

好吧,所以我不是在Python中经验丰富。

我有以下Python代码:

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

其中var1是一个整数, var2var3是字符串。

我怎样才能写的变量名称没有Python包括他们作为查询文本的一部分?

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

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

数据库API会正确地转义和引用变量。 小心不要使用字符串格式操作符( % ),因为

  1. 它不会做任何转义或引用。
  2. 它很容易受到不受控制的字符串格式攻击,例如SQL注入 。

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 )。 检查所使用的数据库API模块中的paramstyle字符串常量,并在http://www.python.org/dev/peps/pep-0249/上查找paramstyle,以查看所有参数传递样式是什么!;

http://www.amk.ca/python/writing/DB-API.html

当您简单地将变量的值附加到您的语句时要小心:想像一个用户自己命名';DROP TABLE Users;' – 这就是为什么你需要使用sql转义,当你使用cursor.execute时,Python为你提供了一个体面的方式。 网址中的示例是:

 cursor.execute("insert into Attendees values (?, ?, ?)", (name, seminar, paid) ) 

很多方法。 不要在实际代码中使用最明显的一个( %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))