【问题标题】:pandas dataframe header relation to sql table headerpandas 数据帧头与 sql 表头的关系
【发布时间】:2019-05-18 02:08:57
【问题描述】:

我有一个包含 100 多列的 DataFrame,我正在尝试将其写入 SQL 表。 这是一个完整数据加载的日常流程,它看起来像这样:

now = datetime.datetime.now()
filename = 'extract_' + str(now)[:10]
output = "./output"

sql_df = pd.read_csv(os.path.join(output,filename + '.csv'))
server = "redshift+psycopg2://%s:%s@%s:%s/%s" % (USER,PASSWORD,HOST,str(PORT),DATABASE)
engine = sa.create_engine(server, connect_args={'sslmode': 'verify-ca'}, use_batch_mode=True)
conn = engine.raw_connection()

conn.cursor().execute("truncate table")
%time sql_df.to_sql('table', engine, index=False, if_exists='append') 

我收到以下错误:ProgrammingError: (psycopg2.ProgrammingError) column "column" of relation "table" does not exist

有人可以澄清为什么to_sql 比较 DataFrame 和表的标题(并且除非全部匹配,否则不允许操作),而不是仅仅插入适当的值而不包括标题行?如果不是将 DF 写入 SQL,而是将 csv 上传到 S3,则使用“复制”-没有错误..

我能做些什么来忽略标题并只插入值?

【问题讨论】:

    标签: python sql pandas sqlalchemy amazon-redshift


    【解决方案1】:

    您可以像这样修改输入 df 以匹配表中的名称(其中 db_cols 是您的数据库列名称),我认为这应该适用于您的 MySQLdb 情况:

    db_cols = list(pd.read_sql('...')) # where ... is your table will return columns as list
    
    (sql_df
     .rename(columns=dict(zip(sql_df.columns, db_cols)))
     .to_sql(name="table",
             con=alch_engine,
             if_exists="append",
             index=False,
             index_label=None))
    

    【讨论】:

    • 谢谢。 sqlalchemy 的文档由于某种原因不起作用docs.sqlalchemy.org/en/latest/orm/mapping_columns.html.. 我怎样才能得到给定表tabledb_cols
    • 在这个构造中,cursor.description 怎么知道具体看表table?还有len(cursor.description) 为我抛出TypeError: object of type 'NoneType' has no len()。我想我会用pd.read_sql().columns
    • 如果它按照您的预期返回表格,请使用您的方法!我可以随时编辑它,但如果您只是将变量分配为db_cols = pd.read_sql().columns,那么这不会返回错误,它只会返回一个索引对象而不是列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2022-07-28
    • 1970-01-01
    • 2018-03-03
    • 2015-10-09
    • 2011-06-13
    相关资源
    最近更新 更多