我们在不同项目中使用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原始查询的任何人?