pandas数据框标头与sql表标头的关系

时间:2018-12-17 16:58:21

标签: python sql pandas sqlalchemy amazon-redshift

我有一个包含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,则使用“复制”-没有错误。

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

1 个答案:

答案 0 :(得分: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))