nodo-postgres creare database

Sto usando nodo-postgres, e all’inizio della mia applicazione ho voglia di verificare se il database esiste o non esiste. Quindi il mio flusso di lavoro idea è la seguente:

  1. Verificare se myDb è esistente
  2. Se c’è, creare le tabelle
  3. Se non, quindi creare il primo database, tabelle

Come potete vedere, è davvero un processo facile, tuttavia, l’implementazione di driver richiede di avere un nome di database postgres://username:[email protected]/database essere collegati, il che significa che è necessario per connettersi a un database.

Così quello che sto facendo adesso è per la connessione a postgres database all’inizio, facendo una query per creare database, cathing eccezione se è già presente, quindi chiudere la mia connessione e il collegamento al database appena creato, quindi la creazione di tabelle. Ecco il codice:

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

Come vedi io sto aprendo e chiudendo la connessione due volte, e in questo modo sembra sbagliato per me. Sarò felice se si proporre un modo migliore, o forse spiegare come hai fatto a realizzare questo.

  • Per quanto ne so non c’è nessun comando per impostare il database di cui si è collegati (in psql c’è \c nameOfOtherDb ma che è un comando psql che creare una nuova connessione e si chiude il vecchio).
  • Un’altra tecnica: si potrebbe utilizzare una query per vedere se esiste una connessione (da “amministrativo” connessione): select count(*) from pg_catalog.pg_database where datname = 'the_db_name_here';, quindi creare/aprire la seconda connessione. Se si esegue la connessione a 2 database, questo non sembra un problema.
  • il recupero disponibili dbs e verificare se la mia è che ci permetteranno di creare un if/else e questo si romperà il mio sincrono richiamate. ecco perché ho finito di creare il db e catturare l’eccezione
  • Nella riga che dice // ignore if the db is there, si sta ignorando tutti gli errori. Ignorare il duplicato db di errore, è possibile fare qualcosa di simile if (err && err.code === '42P04') { console.log('ignoring the error'); } else if (err) { throw err; }
InformationsquelleAutor anvarik | 2013-12-28

 

4 Replies
  1. 15

    Come potete vedere, è davvero un processo facile, tuttavia, il driver
    implementazione richiede di avere un nome di database
    postgres://username:[email protected]/database per essere collegato, che
    significa che è necessario per la connessione a un database.

    Non è a causa dell’implementazione del driver, è PostgreSQL stesso. È lo stesso con qualsiasi altra lingua o driver.

    Un cliente ha bisogno di essere collegato a un database in modo da poter fare qualsiasi cosa, anche un CREATE DATABASE. Oltre alla postgres database, template1 è spesso utilizzato per questo scopo.

    Quindi, dal momento che è necessario connettersi al database appena creato per creare oggetti al suo interno, non c’è modo di evitare di aprire un’altra connessione.

    In breve, ciò che si sta facendo non può essere semplificato, è già ottimale.

  2. 7

    Ho appena scritto un modulo di: 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);
    });

    Speranza di rendere il codice un po ‘ più pulito.

  3. 3

    Questo è un po ‘ vecchio, ma voglio solo condividere come ho gestito questo tipo di installazione.

    È necessario chiamare il terzo param dalla funzione di callback che è il done da pg.connect(conn, (err, client, done) => {}). Questo rilascerà la connessione e riportare alla piscina.

     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()
    })

Lascia un commento