是否允许多次重用pg QueryFile

时间:2017-11-08 08:43:29

标签: javascript postgresql ecmascript-6 pg pg-promise

我可以重复使用QueryFilepg-promise类型吗?

例如

const pgp = require(`pg-promise`)(options);
const QueryFile = pgp.QueryFile;

const db = pgp(config.DB);
const query =  new QueryFile('queryPath/some.sql', { minify: true });

// running sql query
db.any(query, []);
db.any(query, []);
db.any(query, []);
db.any(query, []);    
db.any(query, []);

目前,我每次要执行它时都会创建新的QueryFile。 e.g。

db.any(new QueryFile('queryPath/some.sql', { minify: true }), []);
db.any(new QueryFile('queryPath/some.sql', { minify: true }), []);
db.any(new QueryFile('queryPath/some.sql', { minify: true }), []);
db.any(new QueryFile('queryPath/some.sql', { minify: true }), []);

如果我多次重复使用同一个查询,是否有任何缺点?

1 个答案:

答案 0 :(得分:1)

  

是否允许多次重用pg QueryFile?

不,不允许,坚持!

类型QueryFile表示文件的虚拟链接,其使用提供了许多优势 - as documented

与此问题相关的两个关键功能是:

  
      
  • 解析和缩小SQL(选项minify/compress),以便进行早期错误检测和紧凑查询。
  •   
  • 可以自动重新加载外部SQL的更改(选项debug),而无需重新启动应用程序。
  •   

如果提供了选项minify / compress,则第一个加载文件,解析并缩小文件。这需要时间和IO,并且不应该多次完成,因为它无论如何都是毫无意义的。

第二点允许它用作虚拟链接,可以在开发模式(选项debug)中自动检测任何文件更改,并自动重新加载和准备文件。在开发环境中,此功能是无价的,无法在外部SQL文件发生更改时重新加载应用程序。

所以缺点是:

  • 创建不必要的IO(额外的文件读取+ SQL解析和缩小)。在你的例子中,情况更糟 - 每次执行查询时都会这样做。
  • 丢失设计QueryFile类型的关键功能(无法自动重新加载)

当您为同一个文件重新创建QueryFile类型时,您使用的是最有用的类型。这就是为什么它会以Creating a duplicate QueryFile object for the same file为您报告警告。

您应该为SQL文件设置一个单独的结构,如pg-promise-demo中所示,请参阅here