node-postgres创建数据库

anv*_*rik 20 postgresql node.js

我正在使用node-postgres,在我的应用程序开始时,我想检查数据库是否存在.所以我的工作流程理念如下:

  1. 检查是否myDb存在
  2. 如果它在那里,创建表
  3. 如果没有,则先创建数据库,然后创建表

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

所以我现在正在做的是postgres在开始时连接到数据库,进行查询以创建数据库,如果它已经存在则阻止异常,然后关闭我的连接并连接到新创建的数据库,然后创建表.这是代码:

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...)';
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

如你所见,我打开和关闭连接两次,这种方式对我来说似乎不对.如果你提出更好的方法,我会很高兴,或者解释你是如何做到这一点的.

Dan*_*ité 15

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

这不是因为驱动程序的实现,而是PostgreSQL本身.它与任何其他语言或驱动程序相同.

客户端需要连接到数据库才能执行任何操作,包括a CREATE DATABASE.除了postgres数据库之外,template1通常也用于此目的.

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

简而言之,您正在做的事情不能简化,它已经是最佳的.


Oli*_*nde 7

我刚刚写了一个模块: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);
});
Run Code Online (Sandbox Code Playgroud)

希望它可以使您的代码更清洁.


Red*_*d.o 5

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

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

 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()
})
Run Code Online (Sandbox Code Playgroud)