отношение заголовка информационного кадра pandas к заголовку таблицы sql - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть DataFrame со 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') 

Я получаю следующую ошибку: ProgrammingError: (psycopg2.ProgrammingError) column "column" of relation "table" does not exist.

Может кто-то уточнить, почему to_sql сравнивает заголовки DataFrame и таблицы (и не допускает операции, если все не совпадают), а не просто вставляет значения соответствующим образом, исключая строку заголовка?Если вместо записи DF в SQL я загружаю csv в S3, то использую «copy» - ошибок нет ..

Что я могу сделать, чтобы игнорировать заголовки и просто вставлять значения?

1 Ответ

0 голосов
/ 17 декабря 2018

Вы можете изменить входной 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))
...