Search code examples
node.jspostgresqlpg-promise

How to insert an integer with nextval function in an multirow insert in pg-promise


Is it possible to use the nextval function in a pg-promise multirow insert? I have a database (that I sadly can't change) where the id has to be inserted via the client like this:

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

This works fine for one insert. But now I have to insert multiple rows at once and tried 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);
});

Is there any way to use nextval('some_object_seq') in this scenario? Sadly I can't change the default value of the id column in the table definition.


Solution

  • Your column should be defined as this:

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

    As opposed to the answer by @baal, you do not need to use def, because you are not providing a default value, rather a complete override for the value, which is what init for.

    And it can be used within upsert queries too.