插入值时出现错误。我的数据库有3列。这里初始化了一个自动增量整数:
connection.execute("CREATE TABLE IF NOT EXISTS {tn} ({nf1} {ft1} PRIMARY KEY AUTOINCREMENT)"\
.format(tn = tableName, nf1 = "IDPK", ft1 = "INTEGER"))
和两个文本字段初始化如下:
connection.execute("ALTER TABLE {tn} ADD COLUMN '{cn}' {ct}".format(tn = tableName, cn = "foo", ct = "TEXT"))
connection.execute("ALTER TABLE {tn} ADD COLUMN '{cn}' {ct}".format(tn = tableName, cn = "bar", ct = "TEXT"))
执行在这里:
connection.execute("INSERT INTO {tn} VALUES (NULL, {col1}, {col2})".format(tn = tableName, col1 = text1, col2 = text2))
抛出的错误是:
sqlite3.OperationalError: no such column: "obfuscatedTextStringInText1"
我不明白为什么它认为列的名称在text1中。我正在使用这种语法在第1列和第2列中插入一个值,因为autoincrement函数带有NULL关键字。
答案 0 :(得分:2)
不要使用字符串格式将变量插入查询。这很危险(你很容易受到SQL injection attacks)和错误提示(正如你已经看到的那样)。 / p>
相反,参数化您的查询:
connection.execute("""
INSERT INTO
{tn}
VALUES
(NULL, :col1, :col2)""".format(tn=tableName),
{"col1": text1, "col2": text2})
请注意,我们cannot parameterize table or column names - 确保您验证并正确转义tableName
,或信任您的来源。
答案 1 :(得分:1)
应该有引号{col1}
和{col2}
,因为它们是作为文本值插入的。例如,它目前正在评估如下:
"INSERT INTO table_name VALUES (NULL, my text 1, my text 2)"