使用knex中的子查询插入默认值

时间:2017-07-13 19:10:20

标签: postgresql knex.js

我有这个问题;

knex('metrics').insert(function() {
  this.select('metric as name')
    .from('stage.metrics as s')
    .whereNotExists(function() {
      this.select('*')
        .from('metrics')
        .where('metrics.name', knex.raw('s.metric'))
    })
})

metrics有两列;一个正在递增的id和名字。我希望这会插入到name列中,因为子查询有一列,标记为name,默认id。然而,它抱怨我提供了一个类型字符列,我的整数列id不同。如何明确表示我希望id采用默认值?

1 个答案:

答案 0 :(得分:2)

这可以解决问题

knex('metrics').insert(function() {
    this
        .select([
            knex.raw('null::bigint as id'), // or any other type you need (to force using default value you need to pass explicitly null value to insert query)
            'metric as name'
        ])
        .from('stage.metrics as s')
        .whereNotExists(function() {
            this.select('*')
                .from('metrics')
                .where('metrics.name', knex.raw('s.metric'))
        })
})

我知道,看起来有点 hacky 。很高兴在knex API中看到类似的内容(下面的示例是提案,而非工作示例

knex('table_name')
    .insert(
        ['name', 'surname'],
        function () {
            this.select(['name', 'surname']).from('other_table'))
        }
    )

哪个产生

insert into table_name (name, surname) select name, surname from other_table;

我不确定这个界面,但你明白了。就像显式写入要插入的字段一样。