1

さまざまなプロジェクトで PostgreSQL 9.4 で Bookshelf.js/Knex.js を使用しています。魅力のように機能します。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);
        });
    });
});

ご覧のとおり、Bookshelf.js/Knex.js の既存の接続を再利用しないため、これは DRY ではありません。

問題は、これを達成するための最良の方法は何ですか?

  • pgKnex postgres 方言で使用される接続クライアントを取得して再利用しようとしていますか? しかし、どのように?せいぜい手に入れることができるようですknex.client.connectionSettings

  • 「単純な関数を使用して大きなオブジェクトを操作する」というコメントで示唆されているように、Knex から大きなオブジェクトを処理するために PostgreSQL 関数を直接使用すること。? しかし、それを具体的にどうするか。そのためのKnex生クエリはありますか?

4

0 に答える 0