node-postgres创build数据库

我正在使用node-postgres ,并在我的应用程序的开始,我想检查数据库是否存在。 所以我的工作stream程如下:

  1. 检查myDb是否存在
  2. 如果有,请创build表格
  3. 如果不是,则先创build数据库,然后创build表

正如你所看到的,这是一个非常简单的过程,但是,驱动程序的实现需要有一个数据库名postgres://username:password@host/database来连接,这意味着你需要首先连接到数据库。

所以我现在所做的是在开始时连接到postgres数据库,创build一个查询来创build数据库,如果它已经存在,则closuresexception,然后closures连接并连接到新创build的数据库,然后创build表。 这里是代码:

 var conStringPri = 'postgres://' + username + ':' + password + '@' + host + '/postgres'; var conStringPost = 'postgres://' + username + ':' + password + '@' + host + '/' + dbName; pg.connect(conStringPri, function(err, client, done) { // connect to postgres db if (err) console.log('Error while connecting: ' + err); client.query('CREATE DATABASE ' + dbName, function(err) { // create user's db if (err) console.log('ignoring the error'); // ignore if the db is there client.end(); // close the connection // create a new connection to the new db pg.connect(conStringPost, function(err, clientOrg, done) { // create the table clientOrg.query('CREATE TABLE IF NOT EXISTS ' + tableName + ' ' + '(...some sql...)'; }); }); }); 

正如你所看到的,我正在打开和closures两次连接,这种方式对我来说似乎是错误的。 如果你提出一个更好的方法,我会很高兴,或者解释你是怎么做到的。

正如你所看到的,这是一个非常简单的过程,然而,驱动程序的实现需要有一个数据库名postgres:// username:password @ host / database来连接,这意味着你需要首先连接到数据库。

这不是因为驱动程序的实现,而是PostgreSQL本身。 这与任何其他语言或驱动程序是一样的。

客户端需要连接到数据库才能执行任何操作,包括CREATE DATABASE 。 除了postgres数据库, template1也经常用于这个目的。

然后,由于您必须连接到刚刚创build的数据库以在其中创build对象,因此无法避免打开另一个连接。

总之,你所做的事情不能简化,已经是最佳的了。

我刚刚写了一个模块: https : //github.com/olalonde/pgtools

 var pgtools = require('pgtools'); pgtools.createdb({ user: 'postgres', password: 'some pass', port: 5432, host: 'localhost' }, 'test-db', function (err, res) { if (err) { console.error(err); process.exit(-1); } console.log(res); }); 

希望它可以使你的代码更清洁一些。

这有点老,但我只想分享我如何处理这种设置。

您需要从pg.connect(conn, (err, client, done) => {}) done的callback中调用第三个参数。 这将释放连接并回到游泳池。

  async.series([ done => { pg.connect(connPrimary, (err, client, releaseConn) => { if (err) return done(err) client.query(`CREATE DATABASE ${conf.database}`, (err) => { if (err && !~err.message.indexOf('already exists')) { return done(err) } client.end() releaseConn() done() }) }) }, done => { let connSecondary = `postgres://${conf.user}:${conf.password}@${conf.host}:${conf.port}/${conf.database}` pg.connect(connSecondary, (err, client, releaseConn) => { if (err) return done(err) let createTableQuery = `CREATE TABLE IF NOT EXISTS test_table(_id bigint primary key, co2_field varchar(40) NOT NULL, temp_field int NOT NULL, quality_field decimal NOT NULL, reading_time_field timestamp NULL)` client.query(createTableQuery, err => { if (err) return done(err) releaseConn() done() }) }) } ], err => { should.ifError(err) doneInit() })