【问题标题】:Unable to append dataframe into sqlite3无法将数据框附加到 sqlite3
【发布时间】:2017-09-30 21:10:19
【问题描述】:

我正在尝试将数据框插入 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 的字段没有问题。

【问题讨论】:

    标签: python sql python-3.x sqlite pandas


    【解决方案1】:

    正如您所注意到的,index 是一个保留字,您不能将其用作列名,至少不能按原样使用 - 您必须使用双引号 (") 对其进行转义:

    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)
    ''')
    

    数据库浏览器可能会自动转义名称,允许您通过保留字调用您在其中创建的列。

    【讨论】:

      【解决方案2】:

      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 以创建表时为您引用标识符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-13
        • 2020-11-24
        • 2021-06-06
        • 2020-02-27
        相关资源
        最近更新 更多