【问题标题】:(sqlite3.OperationalError: no such column: ) error when trying to insert values into sqlite3 db [duplicate](sqlite3.OperationalError:没有这样的列:)尝试将值插入sqlite3 db时出错[重复]
【发布时间】:2022-01-17 08:03:18
【问题描述】:

我无法找到确切解决方案的基本问题。 我正在尝试将参数插入客户表:

def cur():
    db = sqlite3.connect("bookdb.sqlite")
    cursor = db.cursor()
    return cursor

def add_customer(id, name, city, age):
    cursor = cur()
    sql = f'insert into customer(id,name,city,age) VALUES({id}, {name}, {city}, {age})'
    cursor.execute(sql)
    cursor.connection.commit()

使用时:

add_customer(7, 'jimbo', 'NY', 22)

我收到以下错误:

sqlite3.OperationalError: no such column: jimbo

当我只在函数中插入整数而不是字符串时,它似乎工作正常,名称列存在并且我无法向其中添加任何字符串。

【问题讨论】:

  • 使用占位符和参数,而不是代入字符串。这将解决错误(您在{name}{city} 周围缺少引号)并且还可以防止SQL 注入。
  • 使用print(sql),问题应该很明显了。

标签: python sqlite


【解决方案1】:

如果不是很明显,这里是使用占位符进行查询的正确方法,允许数据库连接器进行引用:

db = sqlite3.connect("bookdb.sqlite")
def cur():
    return db.cursor()

def add_customer(id, name, city, age):
    cursor = cur()
    sql = 'insert into customer(id,name,city,age) VALUES(?, ?, ?);'
    cursor.execute(sql, (name, city, age))
    cursor.connection.commit()

您并不真的希望 db 成为函数局部变量。你应该让它是一个全局的,这样你以后可以从中创建更多的游标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2021-01-12
    • 2021-01-27
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多