Python 将dataframe标头关系转换为sql表标头

Python 将dataframe标头关系转换为sql表标头,python,sql,pandas,sqlalchemy,amazon-redshift,Python,Sql,Pandas,Sqlalchemy,Amazon Redshift,我有一个包含100多列的数据框架,我正试图将其写入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

我有一个包含100多列的数据框架,我正试图将其写入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') 
我收到以下错误:
编程错误:(psycopg2.ProgrammingError)关系“table”的列“column”不存在

有人能解释一下为什么
to_sql
会比较数据帧和表的标题(并且除非所有匹配,否则不允许操作),而不是只适当地插入不包括标题行的值吗?如果我将csv上传到S3而不是将DF写入SQL,则使用“复制”-没有错误


我能做些什么来忽略标题而只是插入值呢

您可以修改输入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的文档由于某些原因不起作用。。如何获得给定表的
db_cols
?在这个构造中,
cursor.description
如何具体查看表
table
?另外,
len(cursor.description)
抛出一个
TypeError:type为'NoneType'的对象没有len()
。我想如果它像您所期望的那样返回表,我将只使用
pd.read_sql().columns
,使用您的方法!我总是可以编辑它,但是如果您只是想将变量赋值为
db\u cols=pd.read\u sql().columns
,那么这不会返回错误,它只返回索引对象而不是列表。