Подтвердить что ты не робот

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...)';
        });
    });
});

Как вы видите, я открываю и закрываю соединение дважды, и этот путь мне кажется неправильным. Я буду рад, если вы предложите лучший способ или можете объяснить, как вы это сделали.

4b9b3361

Ответ 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