anv*_*rik 20 postgresql node.js
我正在使用node-postgres,在我的应用程序开始时,我想检查数据库是否存在.所以我的工作流程理念如下:
myDb
存在但是,如您所见,这是一个非常简单的过程,驱动程序实现需要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
通常也用于此目的.
然后,由于您必须连接到新创建的数据库以在其中创建对象,因此无法避免打开另一个连接.
简而言之,您正在做的事情不能简化,它已经是最佳的.
我刚刚写了一个模块: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)
希望它可以使您的代码更清洁.
这有点旧,但我只想分享我如何处理这种设置。
您需要从回调中调用第三个参数,即done
from 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)
归档时间: |
|
查看次数: |
18386 次 |
最近记录: |