使用columnset

时间:2017-10-30 09:11:00

标签: 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
  3. 但是,我不知道如何在这里使用查询文件。如何使用查询文件以避免在我的javascript代码中使用RAW SQL字符串?

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

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

    但是,如果注入部分原始声明,这会让人感到沮丧。

1 个答案:

答案 0 :(得分:3)

首先,根据您使用的列和表,静态声明您的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。

  

我不知道如何在这里使用查询文件

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

您可以创建以下文件:

${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
});