Как вставить целое число с функцией nextval в многострочную вставку в pg-promise - PullRequest
0 голосов
/ 30 января 2020

Можно ли использовать функцию nextval в многострочной вставке pg-обещания? У меня есть база данных (которую я, к сожалению, не могу изменить), где идентификатор должен быть вставлен через клиента, как это:

INSERT INTO some_object (object_id, object_name)
VALUES (nextval('some_object_seq'), ${object_name})
RETURNING object_id;

Это прекрасно работает для одной вставки. Но теперь мне нужно вставить несколько строк одновременно и попробовать pgp.helpers.insert:

const cs = pgp.helpers.ColumnSet(['object_id', 'object_name'], { table });
const query = pgp.helpers.insert(values, cs)  + 'RETURNING object_id';
database.many(query).then(data => {
  return data
}).catch(error => {
  logger.error(error, query);
});

Есть ли способ использовать nextval ('some_object_seq') в этом сценарии? К сожалению, я не могу изменить значение по умолчанию для столбца id в определении таблицы.

Ответы [ 2 ]

1 голос
/ 30 января 2020

Ваш столбец должен быть определен следующим образом:

{
    name: `object_id`,
    init: () => `nextval('some_object_seq')`,
    mod: `:raw`
}

В отличие от ответа @baal, вам не нужно использовать def, потому что вы не предоставляете значение по умолчанию, а скорее полное переопределение для значения, для которого init.

И оно также может использоваться в запросах upsert.

1 голос
/ 30 января 2020

Как писал Берги, в набор столбцов можно добавить выражение по умолчанию, например:

const cs = pgp.helpers.ColumnSet(
        [{
            name: "object_id",
            // setting the DEFAULT value for this column
            def: "nextval('some_object_seq')", 
            // use raw-text modifier to inject string directly
            mod: "^",
        }, 'object_name'], { table });
...