#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() .