Как сохранить / создать отклоненный файл данных с помощью команды копирования vertica с использованием python 3.x

#django #database #python-3.x #vertica

#django #База данных #python-3.x #vertica

Вопрос:

Я копирую данные из csv-файла в таблицу vertica, используя следующий код python:

 with open("D:/SampleCSVFile_2kb/SampleCSVFile_2kb.csv", "rb") as fs:
    my_file = fs.read().decode('utf-8','ignore')
    cur.copy( "COPY STG.unstruc_data FROM STDIN PARSER FDELIMITEDPARSER (delimiter=',', header='false') ", my_file)
  

Это работает нормально, но я тоже хочу сохранить отклоненные данные, поэтому вместо этого я использовал этот запрос для сохранения отклоненных данных.

 COPY STG.unstruc_data FROM STDIN PARSER FDELIMITEDPARSER (delimiter=',',     
header='false') exceptions 'except.csv' rejected data 'reject.csv';
  

Это копирует данные в таблицу vertica, но не создает файл для отклоненных данных.
Возможно ли создать csv-файл для отклоненных данных из python? Если да, то как это можно сделать.

Заранее спасибо за помощь -:)

Ответ №1:

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

Чтобы использовать его, добавьте rejected data to table my_reject_table . После загрузки вы должны иметь возможность запросить это.

Если вы выполните NO COMMIT (параметр инструкции копирования), то таблица отклонений будет временной для этого сеанса. В противном случае это навсегда. Вы можете использовать это, чтобы помочь в запланированном вами рабочем процессе. Если вы хотите, чтобы он был временным, чтобы вы могли запрашивать все отклонения, возможно, лучше использовать temp . Если это для долгосрочного хранения и проверки отклонений, постоянный вариант может быть лучше. Если вы хотите сделать его постоянным и по-прежнему использовать NO COMMIT , просто сделайте COPY один раз с фиксацией, и он создаст его навсегда.

Надеюсь, это поможет.

Комментарии:

1. Теперь я использовал этот запрос для сохранения отклоненных данных в таблице. Но я не могу выполнить КОММИТ в коде python. Откат не работает для команды cursor.copy(). Также как я могу найти строки, сохраненные / затронутые в реальной таблице в cursor.copy() команда. СКОПИРУЙТЕ cb.table_format2 ИЗ стандартного файла, ЗАКЛЮЧЕННОГО в разделитель ‘»‘,’ ПРОПУСТИТЕ 1 отклоненные данные как таблицу cb.table_format2_error1;

2. Кстати, спасибо -:) Ваш ответ полезен для перехода на следующий уровень. Я застрял на этом этапе.

3. NO COMMIT является COPY параметром оператора (но вам нужно будет явно зафиксировать после завершения, temp сохраняется только во время транзакции). Кроме того, COPY возвращает результирующий набор с количеством загруженных строк. Попробуйте выполнить выборку из курсора после выполнения копирования.

4. НИКАКАЯ ФИКСАЦИЯ не работает только для данных в реальной таблице. После добавления NO COMMIT в команду копирования, если я явно фиксирую соединение, данные отправляются в фактическую таблицу, в противном случае отбрасываются. но данные об ошибках всегда попадают в таблицу ошибок в каждом случае. Как сделать данные этой таблицы ошибок доступными только для текущего сеанса?

5. Также в случае команды копирования cursor.rowcount возвращает -1, он возвращает фактическое количество строк только в случае cursor.execute() .