我有一个需要插入多个记录的场景。我有一个表结构,如id(其他表中的fk),key(char),value(char)。需要保存的输入将是上述数据的数组。示例:我有一些数组对象,例如:
lst = [];
obj = {};
obj.id= 123;
obj.key = 'somekey';
obj.value = '1234';
lst.push(obj);
obj = {};
obj.id= 123;
obj.key = 'somekey1';
obj.value = '12345';
lst.push(obj);
在MS SQL中,我将创建并传递TVP。我不知道如何在postgres中实现。所以现在我要做的是使用pg-
promise库将列表中的所有项目保存在postgres sql中的单个查询中。我找不到任何文档/无法从文档中了解。任何帮助表示赞赏。谢谢。
我是pg-promise的作者。
有两种插入多个记录的方法。第一种也是最典型的方法是通过事务来确保正确插入所有记录,或确保没有插入任何记录。
使用pg-promise可以通过以下方式完成:
db.tx(t => {
const queries = lst.map(l => {
return t.none('INSERT INTO table(id, key, value) VALUES(${id}, ${key}, ${value})', l);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of null-s
})
.catch(error => {
// ERROR
});
您可以使用方法tx发起事务,然后创建所有INSERT
查询承诺,然后将它们全部批量解决。
第二种方法是将所有插入值连接到一个INSERT
查询中,我将在Performance
Boost
中进行详细说明。。
有关更多示例,请参见任务和事务。
加成
值得指出的是,在大多数情况下,我们不插入记录id
,而是自动生成记录。有时我们想找回新的ID,而在其他情况下我们不在乎。
上面的示例使用null
-s
数组进行解析,因为批处理使用单个结果数组进行解析,而方法none均null
根据其API进行解析。
假设我们要生成新的id,并希望将它们全部收回。为此,我们将代码更改为以下内容:
db.tx(t => {
const queries = lst.map(l => {
return t.one('INSERT INTO table(key, value) VALUES(${key}, ${value}) RETURNING id',
l, a => +a.id);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of new id-s;
})
.catch(error => {
// ERROR
});
即更改是:
id
值RETURNING id
到查询以获取值a => +a.id
了执行自动行转换的功能。更新
必读文章:数据导入。
我想使用单个查询插入多行,例如: 是否有一种方法可以轻松做到这一点,最好是针对如下对象数组: 我最终可能会在一个块中有500条记录,因此不希望运行多个查询。 到目前为止,我只能为单个对象执行此操作: 顺便问一个问题:使用< code>${}符号的插入是否可以防止SQL注入?
问题内容: 我想用一个查询插入多个行,例如: 有没有一种方法可以轻松地做到这一点,最好是针对这样的对象数组: 我可能最终将500条记录放在一个块中,因此运行多个查询将是不可取的。 到目前为止,我只能对单个对象执行此操作: 附带的问题:使用符号插入是否可以防止SQL注入? 问题答案: 我是pg-promise的作者。 在旧版本的库中,Performance Boost文章中的简化示例涵盖了这一点,在
我将一行一行地插入数据,但我在某处听说,如果有许多数据要插入,则需要很多时间。那么,如何一次将它们全部插入?
问题内容: 有没有办法一次插入多个记录而不是一次插入? 我有一个非常丑陋的耙子任务,正在做以下事情… 这必须非常低效,并且必须有更好的方法… 问题答案: 该方法也将数组作为参数。 但是,它仍然对每个条目执行一个SQL查询,而不是单个SQL查询。它效率更高,因为它只需要在后台创建一个activerecord对象。 如果要同时从同一客户端插入许多行,请使用带有多个VALUES列表的INSERT语句一次
问题内容: 在下图中,“ DodgyOldTable”和“MainTable”之间存在1:1的关系。表“选项”包含在“选项描述”字段中具有“选项Val1”,“选项Val2”和“选项Val3”的记录。我需要从DodgyOldTable中选择一个插入MainTable_Option中。像这样的东西: 如果可能的话,我想避免使用几个不同的select语句来执行插入操作。 替代文字http://www.f
问题内容: 可以这样插入一行: 这种方法会自动注释掉任何特殊字符。 如何一次插入多行? 我需要实现这一点: 我可以只使用js字符串运算符手动编译此类行,但是随后我需要以某种方式添加特殊字符转义符。 问题答案: 下面这篇文章:性能提升,从PG-承诺库,其建议的方法: 完全按照您的情况使用的示例: 它也将与一系列对象一起工作: 更新1 有关通过单个查询的高性能方法,请参见使用pg-promise进行多