Вставка NULL/пустой строки с использованием библиотеки libpqxx

В следующем фрагменте кода объект std::string с именем mac иногда представляет собой пустую строку (т. е. ""), и я хочу, чтобы подготовленный оператор автоматически обрабатывал эту переменную как нулевую. Интересно, как это может быть достигнуто в приведенном ниже коде. В своих попытках гуглить я обнаружил, что есть способ установить флаг, указывающий нулевое значение, но я не смог найти конкретного примера. Не могли бы вы привести пример для достижения этого? Спасибо.

try
{
  mConnection->prepare("insertBulkData", mSqlInsertStmt);
  pqxx::work xAction(*mConnection); 

  for(uint32_t i = 0; i < tList.size(); i++)
  {
    TCoreDTO* tCore = tList[i];              
    const std::string& mac   = tCore->getMac();
    const std::string& uuid  = tCore->getUUID();
    int coreNo = (int)tCore->getCoreNo();
    xAction.prepared("insertBulkData")(mac)(uuid)(coreNo).exec();
  }
  xAction.commit();
}
catch(std::exception& pqExp)
{
  //Error handling code
  .....
}

Оператор Insert выглядит следующим образом:

std::string mSqlInsertStmt 
= "INSERT INTO T_CORES (MAC, UUID, CORE_NO) VALUES ($1, $2, $3)";

Структура таблицы следующая:

CREATE TABLE IF NOT EXISTS T_CORES (
ID     SERIAL PRIMARY KEY,                            
MAC    TEXT, 
UUID   TEXT, 
CORE_NO INT DEFAULT 0);  

person F. Aydemir    schedule 05.02.2014    source источник
comment
Для тех, кто использует версию без класса Invocation: stackoverflow.com/a/66851576/2395663   -  person Oğuzhan Türk    schedule 29.03.2021


Ответы (2)


С помощью libpqxx вы можете отправить нулевое значение, вызвав оператор () в подготовленном операторе без аргументов, например:

xAction.prepared("insertBulkData")()(uuid)(coreNo).exec();

отправит NULL в качестве первого параметра инструкции.

Я не думаю, что вы можете заставить его автоматически заменять пустую строку на NULL. Одним из способов добиться этого было бы изменить используемый SQL:

INSERT INTO T_CORES (MAC, UUID, CORE_NO) VALUES (CASE WHEN $1='' THEN NULL ELSE $1 END, $2, $3)
person harmic    schedule 05.02.2014

Быстрое решение... добавьте параметр, который будет указывать, когда вставлять в поле NULL

xAction.prepared("insertBulkData")(mac,!mac.empty())(uuid)(coreNo).exec();

ссылка на документ

person Alexey Rozum    schedule 22.03.2018
comment
Хм ... кажется, это должен быть принятый ответ с 2020 года. - person juzzlin; 23.11.2020