Postgresql игнорирует значение по умолчанию при массовом импорте
У меня есть БД postgres, запущенная в контейнере docker. Я пытаюсь массово импортировать csv с почтовыми индексами. Это проект Django.
Поскольку все они относятся к одному и тому же штату - "NSW". Этого столбца нет в CSV.
Моя модель (это django) имеет следующее определение для столбца State:
state = models.CharField(max_length=200, default="NSW", null=False, blank=False)
Но когда я пытаюсь выполнить, я получаю следующую ошибку:
postgres=# \COPY datacollector_localities(name, postcode) FROM '/postcodes-nsw.csv' DELIMITER ',' CSV HEADER;
ERROR: null value in column "state" of relation "datacollector_localities" violates not-null constraint
DETAIL: Failing row contains (5, Condobolin, 2877, null).
CONTEXT: COPY datacollector_localities, line 2: "Condobolin,2877"
Я предполагал, что если оставить состояние вне списка column_names, то postgres будет использовать значение по умолчанию. Что я делаю неправильно?
Как указано в doc, значения по умолчанию применяются при создании экземпляра вашей модели.
По аналогии с auto_now
эти вопросы не решаются с помощью DB trigger, поскольку это зависит от типа используемой БД.
Я не знаю, как работает импорт CSV (и вы не поделились кодом), но вам нужно сделать что-то вроде:
instances = []
for row in my_csv:
instances.append(MyModel(**row.data))
MyModel.objects.bulk_create(instances)
Предполагается, что данные строки являются диктой с меткой столбца в качестве ключа.