更改 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 已经使用默认值创建了 Column
s):
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 名称和列名称。
这个问题类似于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 已经使用默认值创建了 Column
s):
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 名称和列名称。