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 }));
现在我在我的代码中这样做。我希望能够
但是,我不知道如何在这里使用查询文件。如何使用查询文件以避免在我的javascript代码中使用RAW SQL字符串?
现在我只能想到像这样的查询文件
{statement:raw} WHERE object_id = $/objectId/ AND removed = $/removed/ AND userId = $/userId/ RETURNING *
但是,如果注入部分原始声明,这会让人感到沮丧。
答案 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
});