Как подключиться к PostgreSQL из NodeJS - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь подключиться к базе данных PostgreSQL и выполнить несколько запросов. Хотя я прочитал несколько тем здесь, документы и другие блоги, я не могу заставить его работать.

Моя функция выглядит так:

const postgreSQL = require('pg');

const config = {
  host: 'host',
  database: 'db',
  user: 'user',
  password: 'pass',
  port: 0000,
  max: 5, // max number of clients in the pool
  idleTimeoutMillis: 30000
};
let pool = new postgreSQL.Pool(config);

//.........other code.........

function CheckGeometryType(pool, tableName, column) {

  const schema = 'schema';
  let geometryValue = undefined;
  pool.connect(function(err, client, done) {
    client.query(`SELECT ST_GeometryType(${column})
                  AS geometryType FROM ${schema}.${tableName} LIMIT 1`);
    done(err);
    if (err) {
      console.log('Something went wrong. ' + err);
    }
    console.log("Result: " + queryResult.rows[0]);
    switch (queryResult) {
      // do things with result
    }
    done();
  });

  return geometryValue;
}

Я пытался сделать console.log() внутри SWITCH , после / до done () , но он не выполняется. Я напечатал все запросы SQL, сформированные в строке, которую я передаю pool.query в pgAdmin, и все работает и возвращает ожидаемые значения, которые я хочу получить.

Что я делаю не так?

Спасибо!

--- Редактировать ---

Спасибо за ответы, но я все еще не могу заставить его работать. Я пробовал оба метода, но это не работает. Глядя на Документацию Я пытаюсь этот метод.

Код:

let client = new Client(connectionString);
client.connect();
const query = client.query(new Query('SELECT ST_GeometryType($1) FROM $2.$3 LIMIT 1', [column, schema, tableName]));
console.log(JSON.stringify(query, null, 2)); //Debug purposes
query.on('row', (row) => {
    switch (row[0]) {
        case 'ST_LineString':
            geometryValue = 'LineString';
            break;
        case 'ST_MultiLineString':
            geometryValue = 'MultiLineString';
            break;
        case 'ST_Polygon':
            geometryValue = 'Polygon';
            break;
        case 'ST_MultiPolygon':
            geometryValue = 'MultiPolygon';
            break;
        case 'ST_Point':
            geometryValue = 'Point';
            break;
        case 'ST_MultiPoint':
            geometryValue = 'MultiPoint';
            break;
        default:
            break;
    }
});
query.on('end', (res) => {
    if(result.rows[0] === undefined){
        console.log('No data retrieved from DB');
    }
    client.end();
});
query.on('error', (res) => {
    console.log("Something went wrong: " + res);
});

Отладка, я вижу, что в запросе значения хранятся в порядке:

{
  "text": "SELECT ST_GeometryType($1) FROM $2.$3 LIMIT 1",
  "values": [
    "column",
    "schema",
    "table"
  ],
  "portal": "",
  "_result": {
    "command": null,
    "rowCount": null,
    "oid": null,
    "rows": [],
    "fields": [],
    "_parsers": [],
    "RowCtor": null,
    "rowAsArray": false
  },
  "_results": {
    "command": null,
    "rowCount": null,
    "oid": null,
    "rows": [],
    "fields": [],
    "_parsers": [],
    "RowCtor": null,
    "rowAsArray": false
  },
  "isPreparedStatement": false,
  "_canceledDueToError": false,
  "_promise": null,
  "domain": null,
  "_events": {},
  "_eventsCount": 0
}

Я выполнил запрос на pgAdmin и работает нормально, возвращая желаемый результат, который я ожидаю, но кажется, что попытка выполнить запрос в сценарии не работает.

Что мне не хватает? Спасибо.

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Вы также можете использовать необработанный доступ с пакетом "pg":

pg.connect(connectionString, function (err, client, done) {
  if (err) {
    return handleErrors(done, err, res);
  }
  return client.query("UPDATE tab SET v1=($1)  WHERE k1=($2)", [value, key], 
    function (err, result) {
     return reloadData(res, client, done, err);
  });
});
0 голосов
/ 08 мая 2018

Ну, наконец-то я добился того, чего хочу. После прочтения документации и использования новых методов (некоторые вопросы имели старую версию, версию Node <7.x), я наконец заставил ее работать. Я публикую решение, чтобы помочь кому-то, у кого может быть та же проблема, создать свой собственный скрипт. </p>

Этот метод использует асинхронную / ожидающую форму, поэтому имейте в виду, что вам придется установить все свои функции на асинхронный и установить ожидание для функции, которая ожидает для результата внутри него это цепочка от функции, которая соединяется с БД наверх.

# Main file

#!/usr/bin/env node
'use strict';
const geometryTypeFinder = require("./modules/geometryTypeFinder");


readParametersFromConsole();

async function readParametersFromConsole() {
  ........ code ........
  
  
  processParameters(...params);
}


async function processParameters(...params) {
  ........ code ........
  
  transformation = await geometryTypeFinder.findGeometryType(transformation);

  ........ code ........

}

# Module file

'use strict';

const postgreSQL = require('pg');

module.exports = {
  findGeometryType: async function (transformation) {
    ........ code ........
    transformation.dataModel.entities = await FindGeometryType(...params);
    ........ code ........
  }
};

async function FindGeometryType(entities, geometricColumns) {
  ........ code ........

  for (let i = 0; i < numberOfEntities; i++) {
    ........ code ........
    for (let j = 0; j < numberOfColumns; j++) {
        let column = columns[j];
        let geometryType = await GetGeometryType(tableName, column);
        ........ now I can work with the value of geometryType ........
      }
  }
}

async function GetGeometryType(tableName, column) {

  const schema = 'schema';
  let geometryValue = undefined;
  const config = {
    user: 'user',
    password: 'pass',
    host: 'host',
    database: 'db',
    port: 1234,
  };

  let client = new postgreSQL.Client(config);
  try {
    client.connect();
    const result = await client.query(`SELECT ST_GeometryType(${column}) AS geo_type FROM ${schema}.${tableName} LIMIT 1`);
    if (result.rows.length === 0) {
      console.log('No data retrieved from DB');
    } else {
      const geoType = result.rows[0].geo_type; #<--- I get the result
      ........ code to process the value ........
    }
  } catch (error) {
    console.log(`Error retrieving database information: ${error.name} -> ${error.stack}`);
  } finally {
    client.end();
  }

  return geometryValue;
}

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

Привет.

0 голосов
/ 27 апреля 2018

Вы можете использовать sequelize для PostgreSQL. Это очень хорошее объектно-реляционное отображение (ORM) в Node.js.

const sequelize = new Sequelize («база данных», «имя пользователя», «пароль», { // дай мне postgres, пожалуйста! диалект: «постгрес» })

для более подробной информации, проверьте ссылку ниже. http://docs.sequelizejs.com/manual/installation/usage.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...