Javascript 避免使用原始SQL使用columnset进行内联查询格式化
现在我正在我的代码中做这件事。我希望能够Javascript 避免使用原始SQL使用columnset进行内联查询格式化,javascript,pg-promise,Javascript,Pg Promise,现在我正在我的代码中做这件事。我希望能够 利用列集合 使用pgp.update方法和列集合生成SQL 然而,我也不知道如何利用这里的查询文件。如何使用查询文件以避免在javascript代码中使用原始SQL字符串 现在我只能想这样做查询文件 {statement:raw}其中object_id=$/objectId/和removed=$/removed/和userId=$/userId/返回* 但是注入部分原始语句感觉有点不太正常。首先,根据使用的列和表静态声明对象。例如: const use
{statement:raw}其中object_id=$/objectId/和removed=$/removed/和userId=$/userId/返回*
但是注入部分原始语句感觉有点不太正常。首先,根据使用的列和表静态声明对象。例如:
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 }));
执行查询时,您需要准备WHERE
条件,如下所示:
const cs = new pgp.helpers.ColumnSet(['col1, col2', 'col3'], {table: 'my-table'});
const where = pgp.as.format(' WHERE object_id = ${objectId} AND removed = ${removed} AND
userId = ${userId} RETURNING *', {objectId, removed, userId});
const qf = new pgp.QueryFile(path, options);
然后您可以生成一个完整的UPDATE
sql,如下所示:
const cs = new pgp.helpers.ColumnSet(['col1, col2', 'col3'], {table: 'my-table'});
const where = pgp.as.format(' WHERE object_id = ${objectId} AND removed = ${removed} AND
userId = ${userId} RETURNING *', {objectId, removed, userId});
const qf = new pgp.QueryFile(path, options);
现在您可以执行该sql了
我不知道如何在这里使用查询文件
在您的示例中,使用外部查询文件没有多大意义,尽管您可以,如果您愿意的话,正如进一步解释的那样
您可以创建以下文件:
const updateSql = pgp.helpers.update(data, cs) + where;
然后像加载任何其他查询文件一样加载它:
${update:raw} WHERE object_id = ${objectId} AND removed = ${removed} AND
userId = ${userId} RETURNING *
然后您可以生成一个完整的SQL查询,如下所示:
const cs = new pgp.helpers.ColumnSet(['col1, col2', 'col3'], {table: 'my-table'});
const where = pgp.as.format(' WHERE object_id = ${objectId} AND removed = ${removed} AND
userId = ${userId} RETURNING *', {objectId, removed, userId});
const qf = new pgp.QueryFile(path, options);
看起来我要么冗余地使用queryfilr,要么在代码中编写一些原始sql字符串。Idk为什么我觉得构建原始sql不是一个好的解决方案haha@Zanko库pgpromise
用于执行原始SQL。那么,准备原始SQL有什么问题呢?那些不喜欢编写SQL或不理解SQL的人通常会选择ORM。库pg promise
都是关于最佳性能+终极灵活性的。@Zanko如果我的答案满足您的问题,请接受。b、 t.w.我是《pg promise》的作者,所以你无论如何也找不到更好的答案:)是的,我会的。我对准备原始SQL没有问题。我只是不确定我的方法是否正确和正常。我认为我必须利用查询文件,以便将SQL放入自己的“.SQL”扩展名中,从而从外部格式化中获益。我不习惯在javascript代码中编写原始SQL。不幸的是,如果我们想利用pgp.helpers.update
进行带条件的多重更新,我们必须附加一些原始sql字符串:(@Zanko Raw Text SQL是安全的,只要它是预格式化的,这正是您的情况。我相信您会发现,在您开始编写复杂的SQL查询时,使用外部SQL文件是必不可少的,并且在开发环境发生变化后自动更新它们,可以节省大量时间;)请参阅此处的好处列表: