【问题标题】:pg-promise multi-row update with geom and json columns带有 geom 和 json 列的 pg-promise 多行更新
【发布时间】:2018-04-15 11:43:29
【问题描述】:

我喜欢pg-promise,但很难将多行插入到同时包含 geom 和 json 列的表中。我不确定语法。

我希望能够传入一个对象数组,例如:

[{pt_title: 'title1', 
       lat: -42.360061, 
       lng: -71.065567, 
 waypoints:[[42.360061,-71.065567],[42.360061,-71.06549]]},
{pt_title: 'title2', 
       lat: -43.360061, 
       lng: -71.065567, 
 waypoints:[[43.360061,-71.065567],[42.360061,-71.06549]]}]

并更新我的表格点数:

pt_title varchar,
pt_geom geom,
waypoints json

因此,我必须像这样转换 lat 和 lng 值:

ST_GeomFromText(POINT(${pt.lng} ${pt.lat}), 4326)

并且在更新之前将航点数组转换为json。

CAST(pt.waypoints AS json)

我阅读了有关使用更新助手的信息,但找不到任何 gis 列的示例。我不知道如何进行列集以便它知道转换?

另外,是否有一个帮助实用程序,以便我可以在以下情况下看到生成的 SQL 字符串 使用db.none(sql, values) 语法?我想看看插入值的最终 SQL 是什么,这样我就可以看到发生了什么。

【问题讨论】:

  • 我的回答对您不起作用吗?如果是,请接受。

标签: javascript pg-promise


【解决方案1】:

我不知道如何设置列以便它知道转换?

每个Column 中的属性init 是您的转化回调。

这是您的完整 ColumnSet 对象:

const cs = new pgp.helpers.ColumnSet([
    'pt_title',
    {
        name: 'pt_geom',
        mod: ':raw',
        init: c => pgp.as.format('ST_GeomFromText(POINT(${lng}, ${lat}), 4326)', c.source)
    },
    'waypoints:json'
], {table: 'my-table'});

另外,是否有一个帮助实用程序,以便我可以看到生成的 SQL 字符串...?

pg-monitor,或者只是处理事件query

【讨论】:

  • 你能举个例子吗?
  • @user2928231 添加 ;)
  • vitaly-t: 使用 columnSet 我生成了这个查询:插入 "walk_points"("walk_id","pt_type","sort","pt_title","dir_text","address", "pt_geom","pt_descr") 值(131,'intro',0,'','','6504 E Camino Vista',ST_SetSRID(ST_Point(-117.76247262954713, 33.83789459593196), 4326),'') 返回 id,排序,walk_id;当我 console.log 并将其粘贴到我的 pg-admin 中时,它运行良好。但是当我从事务中运行它时,我得到 TypeError: Invalid query format。
  • @user2928231 这不加起来。可以显示完整的交易代码吗?
  • 我认为这与我作为 json 字段传入的空数组有关。如果还没有数据,是否有特殊的方法来处理 json 字段?我真的希望这些字段如果为空则为 null。
猜你喜欢
  • 2020-06-12
  • 2017-11-29
  • 1970-01-01
  • 2021-09-27
  • 2017-04-03
  • 2017-06-07
  • 2016-10-31
  • 2017-05-30
  • 1970-01-01
相关资源
最近更新 更多