我有类似的问题,但是我想摆脱名字中的任何引用字符。这是一个例子:
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参数。但我不知道在哪里打电话。提前感谢您的回答。
答案 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不会引用表名和列名。