Использование метаданных для типов данных при записи в базу данных - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь регулярно копировать несколько больших таблиц данных из одной базы данных в другую. В поисках быстрой передачи между двумя базами данных без изменения типов данных во время процесса, например, логическое преобразование в текст.

Я начал с панд read_sql_table() и to_sql(), которые хорошо сохраняют исходные типы данных вновая база данных. Однако они выполняются довольно медленно для 1M + строк данных.

Далее я попытался использовать временные файлы CSV с операторами COPY. Это значительно улучшает время копирования и записи таблицы в новую базу данных. Тем не менее, я теряю оригинальные типы данных во время этого процесса;дата становится датой, а логическое становится текстом. В идеале я не хочу иметь дополнительный код для повторного преобразования типов данных в базе данных.

В настоящее время я изучаю идею использования sqlalchemy для копирования таблицы и использования метаданных таблицы длязаписать таблицу в новую базу данных с ее исходными типами данных.

import sqlalchemy as db
engine = db.create_engine("postgresql+psycopg2://username:password@/database?host=datawarehouse")
connection = engine.connect()

# Gets metadata of the customers table
metadata = db.MetaData()
metadata.reflect(bind=engine)
metadata.tables['customers']

# Gets data from the customers table
customers = db.Table('customers', metadata, autoload=True, autoload_with=engine)
query = db.select([customers])
ResultProxy = connection.execute(query)
ResultSet = ResultProxy.fetchall()

Данные поступают в python как список (список списков), который копирует быстро (скорость, аналогичная временной обработке CSV).

Есть ли способ поместить данные в новую таблицу с типами данных, указанными в метаданных?

Я надеюсь, что есть способ быстрой передачи больших таблиц без потери исходных типов данных, особенно булевых. Плюс, будьте обобщаемыми для многих таблиц.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...