Я создаю командный файл pgloader для импорта набора CSV-файлов, предоставленных другой командой, в таблицу в базе данных Postgres.Загрузка правильно сформированных файлов работает нормально, но мы должны планировать, чтобы наши входные файлы были плохо отформатированы.В идеале я хотел бы пропустить и записать все плохие строки в мои входные файлы;документация гласит:
Чтобы разрешить повторную попытку данных и загрузку хороших деталей, используйте параметр при ошибке возобновить следующий , который по умолчанию используется для загрузки данных на основе файлов (например,CSV, IXF или DBF).
, но я не могу заставить его работать.
Это мой командный файл:
LOAD CSV
FROM
ALL FILENAMES MATCHING ~/{{{FILE_REGEXP}}}/
IN DIRECTORY '{{STAGING_PATH}}'
WITH ENCODING UTF8
INTO postgresql://{{PGUSER}}:{{PGPASSWORD}}@{{PGHOST}}/{{PGDATABASE}}
TARGET TABLE {{TABLE_NAME}}
WITH
csv header,
on error resume next,
fields terminated by '|',
truncate
;
У меня есть несколько файлов, в которые я специально добавил ошибки для тестирования.Вот часть первого:
"id"|"code"|"first_name"|"first_name_1"|"last_name"
"jba9ltm3rk58e9bg"|"O1smr83CmvMkqnrV"|"Adam"|"Ant"
"wew6tiq5zmkak19y","I4hlQYrcCSlN3KnV"|Barbara|"Barb"|Bell
"mtsunn0i0ac2t30o"|"vePl6Nti7q1s9YeI"|"Carl"|"Chip"|"Cook"
И часть второго:
"id"|"code"|"first_name"|"first_name_1"|"last_name"
"zcwoyy9e2yiuvan3"|"KNK59muKY5AcfQsd"|"Edward"|""|"Ember"
"fvdagry1jbbgtv63","bJnYxUUHo1R3rlYK","Faith","Faith","Flint"
"k606tkzte4t8mjv2"|"qskHKqVvwbPRE0xY"|"Gareth"|"George"|"Gatsby"
Что бы я хотел получитьэто импортировать все хорошие строки и пропустить и записать все плохие строки.Но при первой ошибке pgloader
останавливает обработку текущего файла и переходит к следующему.Это происходит независимо от того, использую я on error resume next
или on error stop
.Например, я никогда не вижу в своей базе данных Карла Кука и Гарета Гэтсби.
Документация говорит о регистрации плохих строк:
В конце загрузки, содержащей отклоненные строки, вы будетенайдите два файла в каталоге root-dir, в каталоге с именем, совпадающим с целевой базой данных вашей установки.Имена файлов являются целевой таблицей, и их расширения: .dat для отклоненных данных и .log для файла, содержащего полные журналы на стороне клиента PostgreSQL об отклоненных данных.
В моем случае Pgloader создаеткаталог с именем моей целевой таблицы в выходном каталоге, но в нем ничего нет, хотя во входных файлах явно есть отклоненные строки.
Я также попытался добавить batch rows = 1
в надежде, что pgloader переместитсяна следующую партию одной строки, но в выходных данных не было никаких изменений.
Возможно, я что-то делаю не так.Что я могу проверить?