我不断收到操作错误:无法识别的令牌。当我尝试使用 SQLite Insert 命令将数据插入 SQLite 数据库时,会发生此错误。 我需要做什么来纠正此错误,或者是否有更好的方法可以将数据插入数据库?该数据是以图表基准上方米为单位测量的水位数据,是从加拿大和美国五大湖地区的水位计数据记录仪收集的。该脚本使用 Pandas 库并进行硬编码,以合并来自彼此邻近的水位测量站的数据。我想使用插入命令,以便在将未来数据添加到数据库时可以处理重叠数据。 我什至不会开始假装我知道我在谈论数据库和编程,所以任何帮助我如何解决这个错误的问题都将不胜感激!
我尝试在参数化查询中更改我的脚本来尝试解决问题,但没有任何运气,因为我的研究表明这可能是罪魁祸首
# Tecumseh. Merges station in steps due to inability of operation to merge all stations at once. Starts by merging PCWL station to hydromet station followed by remaining PCWL station and 3 minute time series
final11975 = pd.merge(hydrometDF["Station11975"], pcwlDF["station11995"], how='outer', left_index=True,right_index=True)
final11975 = pd.merge(final11975, pcwlDF["station11965"], how='outer', left_index=True,right_index=True)
final11975 = pd.merge(final11975, cts, how='outer', left_index=True,right_index=True)
final11975.to_excel("C:/Users/Andrew/Documents/CHS/SeasonalGaugeAnalysis_v2/SeasonalGaugeAnalysis/Output/11975_Tecumseh.xlsx")
print "-------------------------------"
print "11975 - Tecumseh"
print(final11975.info())
final11975.index = final11975.index.astype(str)
#final11975.to_sql('11975_Tecumseh', conn, if_exists='replace', index=True)
#Insert and Ignore data into database to eliminate overlaps
testvalues = (final11975.index, final11975.iloc[:,0], final11975.iloc[:,1], final11975.iloc[:,2])
c.execute("INSERT OR IGNORE INTO 11975_Tecumseh(index,11975_VegaRadar(m),11995.11965), testvalues")
conn.commit()
我希望使用“插入并忽略”命令将数据插入数据库,因为下载时数据通常会重叠。我是数据库新手,但我的印象是“插入和忽略”命令将消除重叠数据。运行脚本时收到的消息是:
</> <Exception has occurred: OperationalError
unrecognized token: "11975_Tecumseh"
File "C:\Users\Documents\CHS\SeasonalGaugeAnalysis_v2\SeasonalGaugeAnalysis\Script\CombineStations.py", line 43, in <module>>
c.execute("INSERT OR IGNORE INTO 11975_Tecumseh(index,11975_VegaRadar(m),11995.11965), testvalues") </>
根据 SQL 标准,您可以创建表或列名称,例如“
11975_Tecumseh
”和 Tecumseh_11975
,但不能创建以数字开头而不使用双引号的表或列名称。
c.execute("INSERT OR IGNORE INTO '11975_Tecumseh'(index,'11975_VegaRadar(m)',11995.11965), testvalues")
您收到的错误是因为表名称 11975_Tecumseh 无效,因为它没有被适当地括起来。
如果您想使用关键字作为名称,则需要将其引用。那里 SQLite 中引用关键字的四种方式:
- 'keyword' 单引号中的关键字是字符串文字。
- "keyword" 双引号中的关键字是一个标识符。 [关键词]A
- 方括号内的关键字是标识符。
标准 SQL。 MS Access 和 SQL 使用这种引用机制 服务器并包含在 SQLite 中以实现兼容性。
Akeyword
- 用重音符号(ASCII 代码 96)括起来的关键字是一个标识符。
- 这不是标准 SQL。 MySQL 使用这种引用机制 为了兼容性而包含在 SQLite 中。为了恢复弹性,当 面对历史SQL语句,SQLite有时会屈服 以上引用规则:
如果在单引号中使用关键字(例如:“key”或“glob”) 允许使用标识符但存在字符串文字的上下文 不允许,则令牌被理解为标识符 字符串文字。
如果在双引号中使用关键字(例如:“key”或“glob”) 无法解析为标识符但存在的上下文 允许字符串文字,则令牌被理解为字符串 文字而不是标识符。
警告程序员不要使用中描述的两种异常 之前的子弹。我们强调它们的存在只是为了旧的 并且格式不正确的 SQL 语句将正确运行。未来版本 SQLite 可能会引发错误而不是接受格式错误的 上述例外情况涵盖的声明。
如果 11975_Tecumseh 是实际的表名称,则必须将其括起来,例如[11975_泰康]
列也同样
还必须适当封闭。
这样做你最终会得到
"INSERT OR IGNORE INTO [11975_Tecumseh]([index],[11975_VegaRadar(m)],[11995.11965]), testvalues"
问题在于
,testvalues
在语法上不正确。在要插入的列之后,即 ([index],[11975_VegaRadar(m)],[11995.11965])
应使用带有三个值的关键字 VALUES。
有效声明的示例是:
"INSERT INTO [11975_Tecumseh] ([index],[11975_VegaRadar(m)],[11995.11965]) VALUES('value1','value2','value3')"
就这样
c.execute("INSERT INTO [11975_Tecumseh] ([index],[11975_VegaRadar(m)],[11995.11965]) VALUES('value1','value2','value3')")
将插入一个新行(除非发生约束冲突)
但是,我怀疑您想根据变量插入值,在这种情况下您可以使用:
"INSERT INTO [11975_Tecumseh] ([index],[11975_VegaRadar(m)],[11995.11965]) VALUES(?,?,?)"
问号是占位符/绑定值
然后使用以下命令调用:
c.execute("INSERT INTO [11975_Tecumseh] ([index],[11975_VegaRadar(m)],[11995.11965]) VALUES(?,?,?)",testvalues);
#工作示例:
import sqlite3
drop_sql = "DROP TABLE IF EXISTS [11975_Tecumseh]"
crt_sql = "CREATE TABLE IF NOT EXISTS [11975_Tecumseh] ([index],[11975_VegaRadar(m)],[11995.11965])"
testvalues = ("X","Y","Z")
c = sqlite3.connect("test.db")
c.execute(drop_sql)
c.execute(crt_sql)
insert_sql1 = "INSERT INTO [11975_Tecumseh] " \
"([index],[11975_VegaRadar(m)],[11995.11965]) " \
"VALUES('value1','value2','value3')"
c.execute(insert_sql1)
insert_sql2 = "INSERT OR IGNORE INTO '11975_Tecumseh'" \
"('index','11975_VegaRadar(m)',[11995.11965])" \
" VALUES(?,?,?)"
c.execute(insert_sql2,(testvalues))
cursor = c.cursor()
cursor.execute("SELECT * FROM [11975_Tecumseh]")
for row in cursor:
print(row[0], "\n" + row[1], "\n" + row[2])
c.commit()
cursor.close()
c.close()
#结果
##第 1 行
value1 value2 value3
##第 2 行
X Y Z