更改 sql 文件的架构(删除名称中的引号)

change schema for sql file (drop quotes in names)

这个问题类似于drastega's question

我有类似的问题,但我想去掉名称中的任何引号字符。这是一个例子:

CREATE TABLE Resolved (
              [Name] TEXT,  
              [Count] INTEGER,  
              [Obs_Date] TEXT,  
              [Bessel_year] REAL,
              [Filter] TEXT,
              [Comments] TEXT
            );

更改为:

CREATE TABLE Resolved (
              Name TEXT,  
              Count INTEGER,  
              Obs_Date TEXT,  
              Bessel_year REAL,
              Filter TEXT,
              Comments TEXT
            );

按照上面的 link 的步骤,我已经成功地将“[”改为引号。但是,我不想使用任何引号字符。我试图阅读有关 sqlalchemy's metadata 的文档。我知道我需要使用 quote=False 参数。但我不知道在哪里调用它。预先感谢您的回答。

有点奇怪的是 sqlite 应用程序在引号上出错(因为 sqlite 应该不区分大小写,引号与否),我也会对您在列名中提到的一些特殊字符非常谨慎。但是,如果您需要将数据插入到带有不带引号的模式的 sqlite 中,您可以执行以下操作。

从这里开始:

import pandas as pd
from pandas.io import sql
import sqlalchemy
from sqlalchemy import create_engine

engine = create_engine('sqlite:///:memory:')
df = pd.DataFrame({'Col1': [1, 2], 'Col2': [0.1, 0.2]})
df.to_sql('test', engine, if_exists='replace', index=False)

所以默认情况下 sqlalchemy 使用引号(因为你有大写字母,否则不会使用引号):

In [8]: res = engine.execute("SELECT * FROM sqlite_master;").fetchall()

In [9]: print res[0][4]
CREATE TABLE test (
        "Col1" BIGINT,
        "Col2" FLOAT
)

Slqalchemy 在每个 Column 上都有一个 quote 参数,您可以将其设置为 False。要结合 pandas 函数执行此操作,我们必须使用一种变通方法(因为 pandas 已经使用默认值创建了 Columns):

db = sql.SQLDatabase(engine)
t = sql.SQLTable('test', db, frame=df, if_exists='replace', index=False)

for c in t.table.columns:
    c.quote = False

t.create()
t.insert()

以上等同于 to_sql 调用,但在写入数据库之前与创建的 table 对象进行交互。现在你没有引号:

In [15]: res = engine.execute("SELECT * FROM sqlite_master;").fetchall()

In [16]: print res[0][4]
CREATE TABLE test (
        Col1 BIGINT,
        Col2 FLOAT
)

Joris 的代码在我的案例中运行良好,只需将 c.quote = False 行更改为 c.name.quote = False 对于 postgres 数据库,pandas 版本 0.23.4、sqlalchemy=1.2.13 和 python 3.6。

您可以尝试将 table 名称和列名都使用小写。然后 SQLAlchemy 将不会引用 table 名称和列名称。