У меня есть 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, то использую «копировать» - ошибок нет ..
Что я могу сделать, чтобы он игнорировал заголовки и просто вставлял значения?
Вы можете изменить входной 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))
В этой конструкции, как cursor.description
узнает, что конкретно нужно смотреть на таблицу table
? Также len(cursor.description)
подбрасывает мне TypeError: object of type 'NoneType' has no len()
. Думаю просто воспользуюсь pd.read_sql().columns
если он возвращает таблицу, как и следовало ожидать, используйте свой метод! Я всегда могу отредактировать это, но если вы просто имеете в виду присвоение переменной db_cols = pd.read_sql().columns
, тогда это не возвращает ошибку, а просто возвращает объект индекса, а не список.
Спасибо за это. Документация для sqlalchemy по какой-то причине не работает docs.sqlalchemy.org/en/latest/orm/mapping_columns.html .. Как я могу получить
db_cols
для данной таблицыtable
?