Копирование данных из postgres в ZODB с использованием pandas - read_csv или read_sql или blaze?

Я создаю новое приложение, которое использует ZODB, и мне нужно импортировать устаревшие данные в основном из базы данных postgres, а также из некоторых CSV-файлов. Для данных требуется ограниченное количество манипуляций (объединения SQL для объединения связанных таблиц и создания свойств, изменения имен некоторых свойств, работы с пустыми столбцами и т. Д.).

С подмножеством данных postgres я сделал дамп в файлы csv всех соответствующих таблиц, прочитал их в кадры данных pandas и провел манипуляцию. Это работает, но есть ошибки, которые частично связаны с первой передачей данных в csv.

Теперь я хочу загрузить все данные в (и избавиться от ошибок). Мне интересно, имеет ли смысл подключаться напрямую к базе данных и использовать read_sql или продолжать использовать файлы csv.

Самая большая таблица (CSV-файл) занимает всего 8 МБ, поэтому, я надеюсь, у меня не должно быть проблем с памятью. Большинство ошибок связано с кодировкой и / или выбором разделителя (данные содержат |,;,: и ').

Любой совет? Я также читал о чем-то под названием Blaze и удивляюсь, должен ли я на самом деле использовать это.

1 ответ

Решение

Если ваши CSV-файлы не очень большие (как вы говорите), я бы попробовал загрузить все в postgres с помощью odo затем с помощью blaze выполнить операции, а затем выполнить дамп в формат, понятный ZODB. Я не буду беспокоиться о производительности таких операций, как join внутри базы данных по сравнению с памятью в масштабе, о котором вы говорите.

Вот пример кода:

from blaze import odo, Data, join

for csv, tablename in zip(csvs, tablenames):
    odo(csv, 'postgresql://localhost/db::%s' % tablename)

db = Data('postgresql://localhost/db')

# see the link above for more operations
expr = join(db.table1, db.table2, 'column_to_join_on')

# execute `expr` and dump the result to a CSV file for loading into ZODB
odo(expr, 'joined.csv')
Другие вопросы по тегам