node-postgres创build数据库
我正在使用node-postgres ,并在我的应用程序的开始,我想检查数据库是否存在。 所以我的工作stream程如下:
- 检查
myDb
是否存在 - 如果有,请创build表格
- 如果不是,则先创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() })