我正在尝试使用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()
帮助我摆脱此错误:(
答案 0 :(得分:2)
您无法命名表index
。 INDEX
是保留关键字。
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
。