【问题标题】:auto-alias fields in query?查询中的自动别名字段?
【发布时间】:2019-08-14 00:31:38
【问题描述】:

已编辑

我有两个“问题”:

  • pg-promise 结果是包含所有小写选定字段的对象
  • 在我们公司,我们为数据库的字段实施了命名约定

我们不希望服务器返回具有真实字段名称的对象。我可以像这样使用receive 事件重命名它们:

const initOptions = {
  receive(data, result, e) {
    // data = { myid: 1, tname: 'name' }
    refactorProperties(data);
    // data = { myId: 1, name: 'name' }
  }
};

const columnToJS = {
  "myid": "myId",
  "tname": "name",
  "anotherdatabasefieldname": "theJSObjectProperty",
};

function refactorProperties(data) {
  data.forEach(tmp => {
    for(const prop in tmp) {
      const newProp = columnToJS[prop];
      if(newProp) {
        tmp[newProp] = tmp[prop];
        delete tmp[prop];
      }
    }
  });
}

这里它是一个非常小的对象,但实际上它会大得多(连接查询等)doc 指定

这里的任何数据预处理都需要快速,以避免性能损失。

限制是多少? pg-promise 是否有帮助者或类似的东西来使用 Columns 完成此操作?

const cs = new pgp.helpers.ColumnSet([
        { name: 'myid', prop: 'myId', cnd: true /* other options */ }
        { name: 'tname', prop: 'name' /* other options */ },
        { name: 'anotherdatabasefieldname', prop: 'theJSObjectProperty' /* other options */  },
      ], {
        table: 'mytable'
    });
const query = pgp.helpers.insert(obj, cs);
// query = "INSERT INTO "mytable"("tname","anotherdatabasefieldname") VALUES('nameValue','anotherValue')"

const query2 = pgp.helpers.insert(obj, cs, true); // third params = return values ?
// query2 = "INSERT INTO "mytable"("tname","anotherdatabasefieldname") VALUES('nameValue','anotherValue') RETURNING myid AS "myId", tname AS "name", anotherdatabasefieldname AS "theJSObjectProperty"

const query3 = pgp.helpers.select(obj, cs);
// query3 = "SELECT myid AS "myId", tname AS "name", anotherdatabasefieldname AS "theJSObjectProperty" FROM mytable where [...]"

【问题讨论】:

  • 不清楚您在寻找什么。你能突出实际问题吗?不清楚你想inverse,而without put aliases in each query。第二部分看起来像你想骆驼化它?该示例看起来不一致,但可以得出结论。
  • 我编辑了我的帖子。我希望它更清楚。我所说的“反向”是指,因为我们可以使用Column 将 JS 对象属性绑定到数据库字段,是否可以使用它在查询中生成别名?
  • pg-promise 不做任何选择别名,因为它根本不生成任何 SELECT 语句。

标签: node.js pg-promise


【解决方案1】:

pg-promise 中的命名空间 helpers 仅用于帮助您以与单行插入和更新相同的方式生成多行插入和更新。仅此而已,仅此而已。它不是用来生成任何SELECT 语句的,你必须自己做:

它将生成多行 INSERT / UPDATE 查询与单行查询的方法统一起来。

当涉及到很多列的别名以及一般复杂的 SQL 查询时,您应该将所有这些都保存在外部 SQL 文件中,就像 pg-promise-demo 向您展示的那样。使用该结构,您可以轻松编写任意大小和复杂度的 SQL 以及内联 SQL 文档,并让 pg-promise 使用这些内容并缩小以快速执行。

至于骆驼列,receive 事件的 API 就在此处提供了示例。

限制是多少?

限制是常识,而不是物理限制。您正在预处理事件receive 中从服务器到达的所有数据,并且您不希望它花费太多时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 2012-06-06
    • 2014-07-06
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多