Pg-promise 性能提升:冲突

2023-12-30

我正在尝试遵循 pg-promise 库作者推荐的性能模式here https://github.com/vitaly-t/pg-promise/wiki/Performance-Boost.

基本上,Vitaly 建议使用插入来这样做:

var users = [['John', 23], ['Mike', 30], ['David', 18]];

// We can use Inserts as an inline function also:

db.none('INSERT INTO Users(name, age) VALUES $1', Inserts('$1, $2', users))
    .then(data=> {
        // OK, all records have been inserted
    })
    .catch(error=> {
        // Error, no records inserted
    });

使用以下辅助函数:

function Inserts(template, data) {
    if (!(this instanceof Inserts)) {
        return new Inserts(template, data);
    }
    this._rawDBType = true;
    this.formatDBType = function () {
        return data.map(d=>'(' + pgp.as.format(template, d) + ')').join(',');
    };
}

我的问题是,当插入有限制时你会怎么做? 我的代码:

db.tx(function (t) {
    return t.any("SELECT... ",[params])
        .then(function (data) {

          var requestParameters = [];

          async.each(data,function(entry){
            requestParameters.push(entry.application_id,entry.country_id,collectionId)
          });

          db.none(
            " INSERT INTO application_average_ranking (application_id,country_id,collection_id) VALUES ($1)" +
            " ON CONFLICT ON CONSTRAINT constraint_name" +
            " DO UPDATE SET country_id=$2,collection_id=$3",
            [Inserts('$1, $2, $3',requestParameters),entry.country_id,collectionId])

            .then(data=> {
              console.log('success');
            })
            .catch(error=> {
              console.log('insert error');
            });

        });

});

显然,我无法访问参数,因为我脱离了异步循环。

我也尝试做这样的事情:

        db.none(
        " INSERT INTO application_average_ranking (application_id,country_id,collection_id) VALUES ($1)" +
        " ON CONFLICT ON CONSTRAINT constraint_name" +
        " DO UPDATE SET (application_id,country_id,collection_id) = $1",
        Inserts('$1, $2, $3',requestParameters));

但当然,它不尊重 postgresql 的标准。

有办法实现这一点吗?

Thanks !


我写这个例子是为了性能提升 https://github.com/vitaly-t/pg-promise/wiki/Performance-Boost文章生成简单形式的多插入,仅此而已,这对于文章来说已经足够了。

您在这里尝试做的事情有点复杂,而且显然function Inserts(template, data)没有这样的逻辑。

我无法从头到尾告诉你需要做什么才能改变它以适应你的情况,但它可能会变得非常复杂,甚至可能根本不值得做。

幸运的是,您不必这样做。我一次又一次被问到某些格式化助手,我最近刚刚发布 -助手命名空间 https://github.com/vitaly-t/pg-promise/tree/master/lib/helpers。您需要更新到该库的最新版本(当前为 4.1.9)才能按照您需要的方式使用它。

将您的示例更改为以下内容:

var h = pgp.helpers;
var cs = new h.ColumnSet(['?application_id', 'country_id', 'collection_id'],
    {table: 'application_average_ranking'});

db.tx(t => {
    return t.any("SELECT... ", [params])
        .then(function (data) {

            var insertData = data.map(d => {
                return {
                    application_id: d.application_id,
                    country_id: d.country_id,
                    collection_id: collectionId
                };
            });

            var updateData = {
                country_id: entry.country_id,
                collection_id: collectionId
            };

            var query = h.insert(insertData, cs) +
                " ON CONFLICT ON CONSTRAINT constraint_name DO UPDATE SET " +
                h.sets(updateData, cs);

            db.none(query)
                .then(data => {
                    console.log('success');
                })
                .catch(error => {
                    console.log('insert error');
                });
        });
});

这样就可以了。

也可以看看:列集 http://vitaly-t.github.io/pg-promise/helpers.ColumnSet.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pg-promise 性能提升:冲突 的相关文章

随机推荐

  • 如何使用shared_ptr并继承enable_shared_from_this创建克隆方法

    我已经看到编写返回 boost shared ptr 的克隆方法的一种有用方法是 class A public shared ptr a Clone const return shared ptr a CloneImpl protected
  • LongListSelector 和 DataTemplateSelector

    我正在使用 LongListSelector 来实现我的项目的列表或网格显示 为此 我创建了一个 DataTemplateSelector 并在运行时更改 LayoutMode 属性 这是可行的 但 DataTemplateSelector
  • 未处理的拒绝(错误):无法加载“WebPortal”的设置 - ASP.NET Core React

    我创建了一个 ASP NET Core 3React项目 我不断收到此错误 未处理的拒绝 错误 无法加载 WebPortal 的设置 GET https localhost 44367 configuration WebPortal htt
  • Spring框架的隐藏特性? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何修复错误“无法使用类型为 ((AnyObject!, NSError!) -> Void) 的参数列表调用 'findObjectInBackgroundWithBlock'

    对于下面的代码 得到Can t invoke findObjectInBackgroundWithBlock with an argument list of type AnyObject NSError gt Void 错误并且无法在后台
  • 如何仅使用 numpy 和 PIL 检测图像翻译

    给定两个图像 我需要检测两者之间是否存在平移偏移 我只能使用 numpy 和 PIL 这个帖子 https stackoverflow com questions 37584977 translate image using pil展示了如
  • 返回其自身类型的方法的接口

    我有一个情况 我正在上课 class Foo Foo Bar return new Foo 现在我想为它创建一个界面 class IFoo Bar 问号应该用什么代替 每个类都应该返回它自己的类型 而不是 Foo 下面的解决方案有效 但看起
  • 在某些视图中隐藏渲染页面 Razor

    在我的 mvc 应用程序中 我制作了一个页脚并像这样嵌入它 div class off canvas wrap div class inner wrap Html Action Menu Site div div
  • Android 无需开启蓝牙即可进行蓝牙扫描

    我正在创建一个具有低功耗蓝牙的应用程序 我发现了一件有趣的事情 我知道对于API level 23或更高版本 除了蓝牙之外 您还需要授予位置权限才能进行扫描 但我不知道即使从设置中关闭蓝牙也可以扫描 BLE 设备 我关闭了蓝牙 但定位功能仍
  • 如何从队列中获取特定元素?

    Unlike ArrayList 没有get int index 中的方法Queue检索指定位置的元素 有人请告诉我如何实现这一目标Queue Thanks 通过索引访问元素不是队列概念的一部分 如果您需要通过索引访问元素 您需要一个列表
  • MediaRecorder 在 Android 上启动视频捕获时出现问题

    我正在尝试开发一个应用程序 除其他外 它还可以录制用户的视频 因此 如果有前置摄像头 我需要使用前置摄像头捕获视频 我构建了一个相机预览 效果很好 我使用 Android How To Sites 构建了 MediaRecorder 并进行
  • Django:带条件的 ModelForm

    我正在尝试创建一个表单变量 默认玩家等级为 0 他可以更改名字 当他达到1级后 他可以更改名字和头像 当他达到3级时 他可以更改名字 头像和职业 ETC 模型 py class Player models Model level model
  • 是否允许使用多个非类型模板参数包?

    temp param p11 说 在 N4527 中 函数模板的模板参数包后面不应跟有另一个模板参数 除非该模板参数可以从函数模板的参数类型列表推导出来或具有默认参数 在这样的背景下non type模板参数包 不能有默认参数 那么到底需要为
  • C# 图表从数据表添加多个系列

    我从数据库中检索了几个大小各异的数据表 这 2 个中的一个只是一个示例 See the structure here I managed to create the 2 different series and have them show
  • 使用流添加到 azure blob 存储

    我正在尝试添加一个IFormFile通过 net core Web API 接收到 azure blob 存储 这些是我设置的属性 static internal CloudStorageAccount StorageAccount gt
  • C# 泛型的反约束

    灵感来自Phil Haack 对 null 或空合并的尝试 http haacked com archive 2010 06 16 null or empty coalescing aspx 我正在尝试编写一些扩展方法string对象 以及
  • 使用 jQuery/ajax 进行基本身份验证

    我正在尝试创建基本身份验证页面 其中我的表单包含三个字段 username password 拨款类型 提交表单时 我只想以 JSON 格式在 HTML 上显示服务器返回的响应 我对 Web 服务的 AJAX 调用也需要授权要设置的标题 但
  • 如何使用 Java 正则表达式捕获并重用匹配项?

    我试图记住在 Java 中进行查找替换正则表达式匹配的正确符号 说我有绳子 String s My name is Eric and I have a bee called Eric and a fish called Wanda 我想做如
  • 如何设置PyQt5 Qtimer以指定的时间间隔更新?

    我想根据 15 FPS 的帧速率更新 Qtimer 所以我的 def update 每 0 06 秒接收一个信号 你能帮助我吗 我在下面附加了一个代码示例 其中我的 setInterval 输入是 1 15 但我不知道这是否是正确的方法 谢
  • Pg-promise 性能提升:冲突

    我正在尝试遵循 pg promise 库作者推荐的性能模式here https github com vitaly t pg promise wiki Performance Boost 基本上 Vitaly 建议使用插入来这样做 var