我正在尝试将数据框插入sqlite。我现有的数据框如下:
---------------------------------------
|date |location|location_code|
---------------------------------------
0 |12/14/2016 | FL | 2
1 |12/15/2016 | NY | 3
我的python 3代码:
import sqlite3
conn = sqlite3.connect('transaction.sqlite')
cur = conn.cursor()
cur.executescript('''
DROP TABLE IF EXISTS New;
CREATE TABLE New (
index INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
date TEXT,
location TEXT,
location_code INTEGER)
''')
df.to_sql("Records", conn, if_exists="append")
conn.commit()
conn.close()
当我运行代码时,出现以下错误:
Traceback (most recent call last):
File "C:/dbtest.py", line 15, in <module>
''')
sqlite3.OperationalError: near "index": syntax error
我知道当我将单词索引更改为另一个单词时,它可以正常工作。
但是,我在数据库浏览器中为sqlite创建一个名为index的字段没有问题。
答案 0 :(得分:1)
正如您所注意到的那样,index
是一个保留字,您不能将它用作列名,至少不是原样 - 您必须使用双引号将其转义({{ 1}}):
"
数据库浏览器可能会自动转义名称,允许您通过保留字调用您在其中创建的列。
答案 1 :(得分:0)
index
是reserved keyword。您需要引用它才能成为标识符:
CREATE TABLE New (
"index" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
date TEXT,
location TEXT,
location_code INTEGER)
来自关键词文档:
如果要使用关键字作为名称,则需要引用它。 SQLite中有四种引用关键字的方法:
'keyword'
单引号中的关键字是字符串文字。
"keyword"
双引号中的关键字是标识符。
[keyword]
方括号中的关键字是标识符。这不是标准的SQL。此引用机制由MS Access和SQL Server使用,并包含在SQLite中以实现兼容性。
`keyword`
用严重重音符号(ASCII代码96)括起来的关键字是标识符。这不是标准的SQL。这种引用机制由MySQL使用,并且包含在SQLite中以实现兼容性。
GUI客户端在生成SQL以创建表时通常会为您引用标识符。