Python 避免pandas.to_sql使用双引号写入表(PostgreSQL数据库)
我正在尝试将数据帧导出到sql数据库(Postgres) 我创建了如下表:Python 避免pandas.to_sql使用双引号写入表(PostgreSQL数据库),python,pandas,postgresql,Python,Pandas,Postgresql,我正在尝试将数据帧导出到sql数据库(Postgres) 我创建了如下表: CREATE TABLE dataops.OUTPUT ( ID_TAIL CHAR(30) NOT NULL, ID_MODEL CHAR(30) NOT NULL, ID_FIN CHAR(30) NOT NULL, ID_GROUP_FIN CHAR(30) NOT NULL, ID_COMPONENT CHAR(30) NOT NULL, DT_OPERATION
CREATE TABLE dataops.OUTPUT
(
ID_TAIL CHAR(30) NOT NULL,
ID_MODEL CHAR(30) NOT NULL,
ID_FIN CHAR(30) NOT NULL,
ID_GROUP_FIN CHAR(30) NOT NULL,
ID_COMPONENT CHAR(30) NOT NULL,
DT_OPERATION TIMESTAMP NOT NULL,
DT_EXECUTION TIMESTAMP NOT NULL,
FT_VALUE_SENSOR FLOAT NOT NULL,
DT_LOAD TIMESTAMP NOT NULL
);
conn = sqlalchemy.create_engine("postgres://root:1234@localhost:5432/postgres")
data = [['ID_1', 'A4_DOOUE_ADM001', '1201MJ52', 'PATH_1', 'LATCHED1AFT',
'2016-06-22 19:10:25', '2020-11-12 17:20:33.616016', 2.9, '2020-11-12 17:54:06.340735']]
output_df=pd.DataFrame(data,columns=["id_tail", "id_model", "id_fin", "id_group_fin", "id_component", "dt_operation",
"dt_execution", "ft_value_sensor", "dt_load"])
我想将此数据帧写入sql表:
CREATE TABLE dataops.OUTPUT
(
ID_TAIL CHAR(30) NOT NULL,
ID_MODEL CHAR(30) NOT NULL,
ID_FIN CHAR(30) NOT NULL,
ID_GROUP_FIN CHAR(30) NOT NULL,
ID_COMPONENT CHAR(30) NOT NULL,
DT_OPERATION TIMESTAMP NOT NULL,
DT_EXECUTION TIMESTAMP NOT NULL,
FT_VALUE_SENSOR FLOAT NOT NULL,
DT_LOAD TIMESTAMP NOT NULL
);
conn = sqlalchemy.create_engine("postgres://root:1234@localhost:5432/postgres")
data = [['ID_1', 'A4_DOOUE_ADM001', '1201MJ52', 'PATH_1', 'LATCHED1AFT',
'2016-06-22 19:10:25', '2020-11-12 17:20:33.616016', 2.9, '2020-11-12 17:54:06.340735']]
output_df=pd.DataFrame(data,columns=["id_tail", "id_model", "id_fin", "id_group_fin", "id_component", "dt_operation",
"dt_execution", "ft_value_sensor", "dt_load"])
但是,当我运行命令将数据写入数据库output\u df.to\u sql
时,我意识到一个新的表“output”已经创建,其中包含插入的数据
output_df.to_sql(cfg.table_names["output_rep27"], conn, cfg.db_parameters["schema"], if_exists='append',index=False)
这是我在DDBB中看到的:
但是没有引号的同一个表是空的:
当您有意尝试错误地插入表(例如更改列名)时,您会看到pandas使用双引号插入,因为错误:
如何避免在表中插入带有双引号的pandas?短版本pandas是双引号标识符,这是相当标准的。当大写标识符出现这种情况时,在使用它时,您必须从那时起使用双引号。使用它unquoted会将名称折叠为小写,您将找不到该表。有关这方面的详细信息,请参阅。您有三种选择,按照我在comment中的建议执行,并强制名称小写,在使用标识符时始终使用双引号,或者将Panda源代码修改为不使用双引号。我没有找到“好”的解决方案,所以我做的是创建自己的函数来插入值:
import sqlalchemy
import pandas as pd
conn = sqlalchemy.create_engine("postgres://root:1234@localhost:5432/postgres")
data = [['ID_1', 'A4_DOOUE_ADM001', '1201MJ52', 'PATH_1', 'LATCHED1AFT',
'2016-06-22 19:10:25', '2020-11-12 17:20:33.616016', 2.9, '2020-11-12 17:54:06.340735']]
output_df=pd.DataFrame(data,columns=["id_tail", "id_model", "id_fin", "id_group_fin", "id_component", "dt_operation",
"dt_execution", "ft_value_sensor", "dt_load"])
def to_sql(output_df,table_name,conn,schema):
my_query = 'INSERT INTO '+schema+'.'+table_name+' ('+", ".join(list(output_df.columns))+') \
VALUES ('+ ", ".join(np.repeat('%s',output_df.shape[1]).tolist()) +');'
record_to_insert = output_df.applymap(str).values.tolist()
conn.execute(my_query,record_to_insert)
to_sql(output_df,table_name,conn,schema)
我希望它对某些人有用强制将表名小写
cfg.table_names[“output_rep27”].lower()
。这不会关闭双引号,但会导致所有小写表名。可能您误解了,问题不是大写与小写,问题是试图用双引号书写,我曾试图修改字体代码,但我失败了,直到你知道双引号添加到哪里吗?不,我强烈反对修改源代码,原因有两个。1) 你将永远都会这样做。2) 这可能会产生一个新问题。也就是说,当您创建表SOME\u UPPER\u CASE\u NAME
时,名称将变成SOME\u UPPER\u CASE\u NAME
。如果没有报价,箱子就会折叠起来。阅读我在回答中发布的链接,它应该会让事情更清楚。问题不在于pandas,而在于sqlalchemy,这是我修改的代码,它起了作用。除非现在你没有大写/混合大写的表名,而是全小写的表名。您已经失去了使用大写/混合大小写名称的能力。