Node -postgres создать базу данных
Я использую node-postgres, а в начале моего приложения хочу проверить, существует ли база данных. Поэтому моя идея работы следующая:
- Проверьте, существует ли
myDb
- Если он существует, создайте таблицы
- Если нет, тогда создайте сначала базу данных, затем таблицы
Как вы видите, это очень простой процесс, однако для реализации драйвера требуется, чтобы имя базы данных postgres://username:[email protected]/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 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...)';
});
});
});
Как вы видите, я открываю и закрываю соединение дважды, и этот путь мне кажется неправильным. Я буду рад, если вы предложите лучший способ или можете объяснить, как вы это сделали.
Ответы
Ответ 1
Как вы видите, это действительно простой процесс, однако, драйвер для реализации требуется иметь имя базы данных postgres://имя пользователя: пароль @хост/база данных для подключения, которая означает, что вам нужно сначала подключиться к базе данных.
Это не из-за реализации драйвера, это сам PostgreSQL. Это то же самое с любым другим языком или драйвером.
Клиент должен быть подключен к базе данных, чтобы сделать что-либо, включая CREATE DATABASE
. Помимо базы данных postgres
, для этой цели часто используется template1
.
Затем, поскольку вы должны подключиться к только что созданной базе данных для создания объектов внутри нее, нет способа избежать открытия другого соединения.
Короче говоря, то, что вы делаете, не может быть упрощено, оно уже оптимально.
Ответ 2
Я только что написал для этого модуль: 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);
});
Надеюсь, он может сделать ваш код немного более чистым.
Ответ 3
Это немного устарело, но я просто хочу поделиться тем, как я обрабатывал такие настройки.
Вам нужно вызвать третий параметр из обратного вызова, который является done
из 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()
})
Ответ 4
устанавливать
npm install --save -g pgtools
Пример CLI
createdbjs my_awesome_db --user=admin --password=admin