解决使用 SQLite 插入命令时出现“无法识别的令牌”错误

问题描述 投票:0回答:2

我不断收到操作错误:无法识别的令牌。当我尝试使用 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") </>
python pandas sqlite
2个回答
0
投票

根据 SQL 标准,您可以创建表或列名称,例如“

11975_Tecumseh
”和
Tecumseh_11975
,但不能创建以数字开头而不使用双引号的表或列名称。

c.execute("INSERT OR IGNORE INTO '11975_Tecumseh'(index,'11975_VegaRadar(m)',11995.11965), testvalues")

0
投票

您收到的错误是因为表名称 11975_Tecumseh 无效,因为它没有被适当地括起来。

如果您想使用关键字作为名称,则需要将其引用。那里 SQLite 中引用关键字的四种方式:

  • 'keyword' 单引号中的关键字是字符串文字。
  • "keyword" 双引号中的关键字是一个标识符。 [关键词]A
  • 方括号内的关键字是标识符。
  • 这不是

标准 SQL。 MS Access 和 SQL 使用这种引用机制 服务器并包含在 SQLite 中以实现兼容性。

keyword
A

  • 用重音符号(ASCII 代码 96)括起来的关键字是一个标识符。
    • 这不是标准 SQL。 MySQL 使用这种引用机制 为了兼容性而包含在 SQLite 中。为了恢复弹性,当 面对历史SQL语句,SQLite有时会屈服 以上引用规则:

如果在单引号中使用关键字(例如:“key”或“glob”) 允许使用标识符但存在字符串文字的上下文 不允许,则令牌被理解为标识符 字符串文字。

如果在双引号中使用关键字(例如:“key”或“glob”) 无法解析为标识符但存在的上下文 允许字符串文字,则令牌被理解为字符串 文字而不是标识符。

警告程序员不要使用中描述的两种异常 之前的子弹。我们强调它们的存在只是为了旧的 并且格式不正确的 SQL 语句将正确运行。未来版本 SQLite 可能会引发错误而不是接受格式错误的 上述例外情况涵盖的声明。

SQLite 所理解的 SQL - SQLite 关键字

  • 上述内容适用于无效名称,包括以数字开头的名称和括号内包含非数字的名称。

如果 11975_Tecumseh 是实际的表名称,则必须将其括起来,例如[11975_泰康]

列也同样

  • 索引
  • 11975_VegaRadar(米)
  • 11995.11965

还必须适当封闭。

这样做你最终会得到

"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
© www.soinside.com 2019 - 2024. All rights reserved.