Python SQLite3插入

xam8gpfp  于 2023-05-07  发布在  SQLite
关注(0)|答案(3)|浏览(196)

插入值时出现错误。我的数据库有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列中插入了一个值,我认为是用这种语法,作为带有NULL关键字的自动递增函数。

s71maibg

s71maibg1#

  • 不要使用字符串格式将变量插入到查询中。* 这是危险的(你很容易受到SQL injection attacks的攻击)和错误提示(正如你已经看到的)。

相反,parameterize 你的查询:

connection.execute("""
    INSERT INTO 
        {tn} 
    VALUES 
        (NULL, :col1, :col2)""".format(tn=tableName), 
    {"col1": text1, "col2": text2})

请注意,我们cannot parameterize table or column names-确保您验证并正确转义tableName,或信任您的源代码。

mlnl4t2r

mlnl4t2r2#

{col1}{col2}周围应该有引号,因为它们作为文本值插入。例如,它目前正在评估如下:

"INSERT INTO table_name VALUES (NULL, my text 1, my text 2)"
mwngjboj

mwngjboj3#

不要使用字符串格式将变量插入查询。这是危险的(容易受到SQL注入攻击)和错误提示(正如您已经看到的)。
(from@alecxe的回答)我删除了所有的字符串格式,以获得更安全的示例:

new_element={'col1': 'foo', 'col2': 'TEXT with special characters like " and *'}
connection.execute("INSERT INTO tableName VALUES (NULL, :col1, :col2)", new_element)

相关问题