Импорт CSV через COPY FROM не будет работать со значениями NULL - PullRequest
1 голос
/ 17 февраля 2011

У меня есть файл CSV, и я хочу импортировать его с помощью команды Postgres «COPY x FROM y» в моей базе данных. Эта база данных имеет два столбца: столбец с именем «id» (последовательный, NULL не разрешен) и столбец «value» (varchar, NULL разрешен и применено ограничение). Я предоставлю короткий скрипт создания для тестовой базы данных ниже. CSV получается путем экспорта из электронной таблицы OpenOffice. Содержимое CSV также предоставляется в конце.

Моя проблема:

При выполнении следующей команды ...

COPY mytable FROM '/tmp/testdata.csv' CSV HEADER NULL AS E'\N';

... Я получаю это сообщение об ошибке:

ERROR:  value for domain car_manufacturer violates check constraint "car_manufacturer_format"
CONTEXT:  COPY mytable, line 3, column value: "\N"

********** Error **********

ERROR: value for domain car_manufacturer violates check constraint "car_manufacturer_format"
SQL state: 23514
Context: COPY mytable, line 3, column value: "\N"

Вот содержимое файла CSV (экспортированного непосредственно из OpenOffice, поэтому он должен соответствовать стандартам):

"ID","value"
1,"Mercedes"
2,"\N"

Очевидно, у Postgres есть некоторые проблемы с пониманием того, что "\ N" в моем CSV-файле должно быть значением NULL (что фактически разрешено в этом столбце). Во-первых, он проверяет всю строку "\ N" на соответствие ограничению. Так как он не соответствует RegexPattern, определенному в ограничении, он выдаст ошибку, указанную выше. Я попробовал несколько модификаций моей команды COPY-FROM, но ни одна из них не привела к успешному импорту.

Вкратце: Мне нужно решение, позволяющее Postgres мне импортировать csv через команду copy-from-command и, более того, иметь возможность иметь \ N-записи в столбцах string / varchar. представляющие NULL-значения.

Мне действительно нужно сделать это с помощью команды Копировать, потому что я хочу автоматизировать процесс импорта с помощью сценария. При использовании phpPGAdmin для импорта CSV все работает нормально. Это связано с тем, что phpPgAdmin отправляет команды INSERT на сервер postgres. Так что, очевидно, не используется команда «copy from» ...

Дополнительная информация:

Вот сценарий создания для базы данных:

CREATE DOMAIN car_manufacturer AS VARCHAR (100) CONSTRAINT car_manufacturer_format CHECK
(VALUE SIMILAR TO '[A-Z][A-Za-z]+|');
COMMENT ON DOMAIN car_manufacturer IS 'The name of a car manufacturer (e.g, Ford, BMW, Chrysler, Mercedes etc.)';

CREATE TABLE mytable
(
  "ID" serial NOT NULL,
  "value" car_manufacturer,
  CONSTRAINT pk_mytable PRIMARY KEY ("ID")
)
WITH (
  OIDS=FALSE
);
ALTER TABLE mytable OWNER TO postgres;

Заранее большое спасибо!

Ура, Philipp

PS: Мой пример сводится к тому, чтобы показать вам реальную проблему. Поэтому, пожалуйста, не беспокойтесь о тривиальности этого примера: -)

Ответы [ 2 ]

0 голосов
/ 19 августа 2013

«\ N» - это значение, которое можно интерпретировать как команду «Новая строка».

Попробуйте использовать другой символ, например «@».

0 голосов
/ 17 февраля 2011

Я обычно не использую кавычки для символьных полей и использую другой разделитель, чтобы избежать затруднений со встроенными запятыми, например '|'при экспорте открытого офиса в csv.Затем при импорте укажите разделитель, а также экранируйте обратную косую черту, чтобы указать ноль E '\\ N'.

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