更改sql文件的模式(删除名称中的引号)

时间:2015-01-05 11:13:47

标签: python pandas sqlalchemy

此问题与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
            );

按照上述步骤,我已设法将“[”更改为引号。但是,我不想使用任何引用字符。我试着阅读有关sqlalchemy's metadata的文档。我知道我需要使用quote = False参数。但我不知道在哪里打电话。提前感谢您的回答。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

引号上的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在每个quote上都有一个Column参数,您可以将其设置为False。要结合pandas功能,我们必须使用一种解决方法(因为pandas已经使用默认值创建了Column):

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调用,但在写入数据库之前与创建的表对象进行交互。现在你没有引号:

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

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

答案 2 :(得分:0)

您可以尝试对表名和列名使用小写字母。然后,SQLAlchemy不会引用表名和列名。