sqlite3.OperationalError:“索引”附近:语法错误

时间:2018-12-25 05:54:04

标签: python sqlite

我正在尝试使用sqlite3模块使用python连接到数据库,但出现错误- sqlite3.OperationalError:“索引”附近:语法错误


  

我为此寻找了一些解决方案,但没有得到解决方案。一世   是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()

帮助我摆脱此错误:(

2 个答案:

答案 0 :(得分:2)

您无法命名表indexINDEX是保留关键字。

documentation指出:

  

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

答案 1 :(得分:0)

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