Python 避免pandas.to_sql使用双引号写入表(PostgreSQL数据库)

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

我正在尝试将数据帧导出到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 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,这是我修改的代码,它起了作用。除非现在你没有大写/混合大写的表名,而是全小写的表名。您已经失去了使用大写/混合大小写名称的能力。