如何查询Bookshelf / Knex for PostgreSQL大对象

时间:2015-03-19 13:44:20

标签: postgresql bookshelf.js knex.js

我们在不同项目中使用Bookshelf.js / Knex.js和PostgreSQL 9.4。奇迹般有效。 Bookshelf.js / Knex.js很高兴能与之合作。

最近我们将PostgreSQL大对象添加到我们的架构和数据库中,并且正在寻找在此上下文中检索它们的最佳方法。

到目前为止,我们已成功使用pg-large-object模块检索大对象(删除了错误处理的易读性):

var knex = require('knex')({
  client: 'postgres',
  connection: {
    host     : 'localhost',
    user     : 'postgres',
    password : '1234',
    database : 'someapp',
    charset  : 'utf8'
  }
});
var bookshelf = require('bookshelf')(knex);

var pg = require('pg'); 
var LargeObjectManager = require('pg-large-object').LargeObjectManager;
var conString = 'postgres://postgres:1234@localhost/someapp';

pg.connect(conString, function(err, client, done) {

    var man = new LargeObjectManager(client);

    client.query('BEGIN', function(err, result) {
        var oid = 123;
        var bufferSize = 16384;
        man.openAndReadableStream(oid, bufferSize, function(err, size, stream) {
            stream.on('end', function() {
                client.query('COMMIT');
                done();
            });

            var fileStream = require('fs').createWriteStream('bigfile.data');
            stream.pipe(fileStream);
        });
    });
});

正如您所知,这不是DRY,因为我们不会重复使用Bookshelf.js / Knex.js现有连接。

所以问题是:实现这个目标的最佳方法是什么?

  • 尝试检索并重用Knex postgres方言中使用的pg连接客户端?但是怎么样?我们似乎最多只能抓住knex.client.connectionSettings

  • 直接使用PostgreSQL函数处理来自Knex的大型对象,如评论"You work with large objects using simple functions."中所示?但具体怎么做呢? Knex原始查询的任何人?

0 个答案:

没有答案