Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 避免使用原始SQL使用columnset进行内联查询格式化_Javascript_Pg Promise - Fatal编程技术网

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

现在我正在我的代码中做这件事。我希望能够

  • 利用列集合
  • 使用pgp.update方法和列集合生成SQL
  • 然而,我也不知道如何利用这里的查询文件。如何使用查询文件以避免在javascript代码中使用原始SQL字符串

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

    {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文件是必不可少的,并且在开发环境发生变化后自动更新它们,可以节省大量时间;)请参阅此处的好处列表: