【问题标题】:sqlite3.OperationalError: near "index": syntax errorsqlite3.OperationalError:“索引”附近:语法错误
【发布时间】:2018-12-25 05:54:03
【问题描述】:

我正在尝试使用 sqlite3 模块通过 python 连接到数据库,但出现错误 - sqlite3.OperationalError: near "index": syntax error


我为此搜索了一些解决方案,但没有找到解决方案。一世 我是 sqlite3 的新手


def insert_into_db(url, title, description, keywords):
    con = sqlite3.connect('index.db')
    c = con.cursor()
    create = r'''CREATE TABLE IF NOT EXISTS index (id INTEGER NOT NULL AUTO_INCREMENT,url VARCHAR,description TEXT,keywords TEXT);INSERT INTO index(url, title, description, keywords)VALUES('{}','{}',{}','{}');'''.format(url, title,description, keywords)
    c.execute(create)
    con.commit()
    con.close()

帮我摆脱这个错误:(

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    INDEX 是 SQLite3 中的关键字。因此,它将被解析为关键字。不过,有几种方法可以解决这个问题。

    根据documentation,您可以使用反引号或引号将其指定为表名。例如,

    CREATE TABLE IF NOT EXISTS `index` ...
    

    CREATE TABLE IF NOT EXISTS "index" ...
    

    可能会起作用。

    您可以通过execute() 命令将参数传递给您的sql 语句。因此,

    create = r'''CREATE TABLE ... VALUES(?,?,?,?);'''  # use ? for placeholders
    c.execute(create, (url, title, description, keywords))  # pass args as tuple
    

    与直接使用 Python 格式化参数相比,这更安全。

    另请注意,SQLite 的 autoinc 语法是 AUTOINCREMENT 不带下划线,并且它们要求字段也是 INTEGER PRIMARY KEY

    【讨论】:

    • 当我添加反引号并运行它时,我得到这个错误-sqlite3.OperationalError: near "AUTO_INCREMENT": syntax error
    • @SakithKarunasena 试试不带下划线。
    • no AUTOINCREMENT 也不起作用,我得到同样的错误
    • @SakithKarunasena 在INTEGER 之后您需要PRIMARY KEY。 (您也可以删除 NOT NULL,因为 pkey 使其变得多余。
    • 所有 rowid 表 INTEGER PRIMARY KEY 列自动递增,顺便说一句。不需要 AUTOINCREMENT 关键字,除非您特别希望它在正常行为中引起的更改:sqlite.org/autoinc.html
    【解决方案2】:

    您不能为表命名indexINDEX 是保留关键字。

    documentation 声明:

    SQL 标准规定了大量的关键字,这些关键字不能用作表、索引、列、数据库、用户定义函数、排序规则、虚拟表模块或任何其他命名对象的名称。

    【讨论】:

    • 当我将表名更改为 search_index 并运行它时,出现此错误-sqlite3.OperationalError: near "AUTO_INCREMENT": syntax error
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    相关资源
    最近更新 更多