javascript - 避免使用原始 SQL 进行使用列集的 PgPromise 内联查询格式化

标签 javascript pg-promise

 const userPhoneNumber = await transaction.one(pgp.as.format(`${pgp.helpers.update({
      modifiedById: login.objectId,
      modifiedTimestamp: now,
      phoneNumber
    }, columnSets.userPhoneNumbers.forUpdateById)} WHERE object_id = $/objectId/ AND removed = $/removed/ AND userId = $/userId/ RETURNING *`, { objectId, removed: false, userId }));

现在我正在我的代码中执行此操作。我希望能够

  1. 利用列集
  2. 使用 pgp.update 方法和列集来生成 SQL

但是,我也不确定如何在这里使用查询文件。如何使用查询文件以避免在 JavaScript 代码中使用原始 SQL 字符串?

现在我只能想到像这样查询文件

{statement:raw} WHERE object_id = $/objectId/AND returned = $/removed/AND userId = $/userId/RETURNING *

但是注入(inject)部分原始语句感觉有点黑客。

最佳答案

首先,静态声明您的 ColumnSet ,根据您使用的列和表进行对象。例如:

const cs = new pgp.helpers.ColumnSet(['col1, col2', 'col3'], {table: 'my-table'});

当需要执行查询时,您可以像这样准备 WHERE 条件:

const where = pgp.as.format(' WHERE object_id = ${objectId} AND removed = ${removed} AND
  userId = ${userId} RETURNING *', {objectId, removed, userId});

然后你可以生成一个完整的UPDATE sql,如下所示:

const updateSql = pgp.helpers.update(data, cs) + where;

现在您可以执行该 SQL。

I am not sure how to utilize query file here

在您的示例中,使用外部查询文件没有多大意义,但如果您愿意,您可以这样做,如进一步解释的那样。

您可以创建以下文件:

${update:raw} WHERE object_id = ${objectId} AND removed = ${removed} AND 
userId = ${userId} RETURNING *

然后像加载任何其他 QueryFile 一样加载它:

const qf = new pgp.QueryFile(path, options);

然后你可以生成一个完整的 SQL 查询,如下所示:

const updateSql = pgp.as.format(qf, {
    update: pgp.helpers.update(data, cs),
    objectId,
    removed,
    userId
});

关于javascript - 避免使用原始 SQL 进行使用列集的 PgPromise 内联查询格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47011482/

相关文章:

javascript - 基本的 javascript json 子数组解码

javascript - 页面刷新后禁用浏览器的自动滚动?

node.js - 使用 node.js 并 promise 获取分页数据

node.js - 如何将 JSONB 操作与 pg-promise 结合使用

javascript - Flex 容器图像 slider 轮播

javascript - 如何在 Context 内的 useEffect Hook 中传递依赖项

javascript - 在javascript中访问对象内的数组?

javascript - pg-promise 在 UPDATE SET 语句中使用命名参数

pg-promise:BEGIN 和 COMMIT 何时发送?

node.js - 使用事务时,查询中包含的子查询如何在 pg-promise 中工作?