Вставка новой записи в PostgreSQL со значениями по умолчанию из PetaPoco (и Npgsql)

#database #postgresql #petapoco

#База данных #postgresql #petapoco

Вопрос:

В PostgreSQL (9.5) у меня есть следующее определение таблицы:

 CREATE TABLE icd9
(
  recid serial NOT NULL,
  code text,
  cdesc text NOT NULL,
  "timestamp" timestamp without time zone DEFAULT now(),
  CONSTRAINT pk_icd9_recid PRIMARY KEY (recid)
)
  

Используя PetaPoco, у меня есть следующее утверждение:

  icd9 newicd9 = db.SingleOrDefault<icd9>("select * from icd9 where lower(cdesc) = lower(@0)", newdx.cdesc);

 if (newicd9 == null)
 {       
       newicd9 = new icd9 { cdesc = newdx.cdesc.ToLower(), code = newdx.code};
       db.Insert(newicd9);
  }
  

Выполнение Insert(newicd9) с помощью PetaPoco / Npgsql приводит к тому, что «метке времени» новой записи не присваивается никакого значения. Как мне исправить это так, чтобы использовалось значение PostgreSQL ПО УМОЛЧАНИЮ?

(Я могу присвоить метке времени значение при создании экземпляра newicd9, но я бы хотел, чтобы PostgreSQL присвоил его с помощью метода now() ПО УМОЛЧАНИЮ).

Любая помощь приветствуется.

Редактировать: класс icd9 определяется шаблоном PetaPoco T4 как:

     [TableName("nova.icd9")]
    [PrimaryKey("recid")]
    [ExplicitColumns]
    public partial class icd9 : chaosDB.Record<icd9>  
    {
        [Column] public int recid { get; set; }
        [Column] public string code { get; set; }
        [Column] public string cdesc { get; set; }
        [Column] public DateTime? timestamp { get; set; }
    }
  

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

1. Как вы определяете класс icd9?

2. @harmic Класс icd9 определяется шаблоном PetaPoco T4. Пожалуйста, ознакомьтесь с дополнительной информацией. Спасибо.

Ответ №1:

Когда вы выполняете SQL INSERT в таблице, если вы предоставляете значение для столбца, это значение будет сохранено, даже если для столбца было значение по умолчанию.

Единственный способ применить значение по умолчанию — не включать столбец в INSERT инструкцию SQL.

Просматривая исходный код PetaPoco, я вижу, что он создает INSERT оператор, используя все столбцы, кроме:

  • Столбцы, помеченные как «столбцы результатов»
  • столбец первичного ключа

Вы могли бы пометить этот столбец time как столбец результатов (украсив [ResultColumn] ), но, по моему прочтению кода, это также исключило бы его из автоматически сгенерированных SELECT предложений.

Отказ от ответственности: хотя я немного знаю о postgresql, я ничего о нем не знаю.NET или petapoco!

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

1. Спасибо. Используя триггер с Before Insert, я могу принудительно установить временную метку в значение null. Еще раз спасибо.