因此,当我选择将某些数据输入表格时,不输入变量所代表的值,而是输入变量的实际名称,这是一个例子。
name = Josh
surname = Smith
age = 15
import sqlite3
scores_db=sqlite3.connect('E:\\scores_db.db')
c=scores_db.cursor()
c.execute('''INSERT INTO Scores_1A
VALUES ('name','surname','age')''')
scores_db.commit()
scores_db.close()
当我检查数据库文件时,它不是输入变量所代表的信息,而是输入变量名。我想有一些语法来放置变量名吗?
答案 0 :(得分:2)
字符串传递给数据库驱动程序,不知道Python代码中是否有该名称的变量。
这个看似直截了当的解决方案是使用字符串格式化将变量的表示替换为SQL查询,然后再将其发送到数据库。
c.execute("INSERT INTO Scores_1A VALUES ('{}', '{}', '{}')".format(name, surname, age))
然而,请不要那样做。如果其中一个变量扩展到某个意外值,它会使您的代码容易受到 SQL注入的攻击。例如,考虑如果name
是字符串"Robert'; DROP TABLE Scores_1A; -- "
会发生什么。
相反,您应该使用预备语句:
c.execute("INSERT INTO Scores_1A VALUES (?, ?, ?)", (name, surname, age))
这里,数据库驱动程序将接收未修改的字符串,后跟序列化的参数元组。这不仅更快,而且可以防止SQL注入。
通常,您的SQL操作需要使用Python变量中的值。你不应该使用Python的字符串操作来组装你的查询,因为这样做是不安全的;它使您的程序容易受到SQL注入攻击(请参阅http://xkcd.com/327/以获取可能出错的幽默示例)。
相反,请使用DB-API的参数替换。将
?
作为占位符放在您想要使用值的位置,然后提供一个值元组作为游标execute()
方法的第二个参数。