簡體   English   中英

如何從NodeJS連接到PostgreSQL

[英]How to connect to PostgreSQL from NodeJS

我正在嘗試連接到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; } 

我已經嘗試在done()之后/之前在SWITCH內執行console.log() () ,但未執行。 我已經打印了在傳遞給pgAdminpool.query的字符串上形成的所有SQL查詢,並且所有工作都返回了我想要得到的期望值。

我究竟做錯了什么?

謝謝!

-編輯-

感謝您的回答,但我仍然無法使其正常工作。 我已經嘗試了兩種方法,但是都行不通。 查看文檔,我正在嘗試這種方法。

代碼是:

 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上執行了查詢,效果很好,返回了我期望的期望結果,但是似乎無法在腳本上執行查詢。

我想念的是什么? 謝謝。

您還可以將原始acces與“ 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);
  });
});

您可以對PostgreSQL使用sequelize。 Node.js中非常好的對象關系映射(ORM)。

const sequelize = new Sequelize('database','username','password',{// gimme postgres,請!方言:'postgres'})

有關更多詳細信息,請檢查下面的鏈接。 http://docs.sequelizejs.com/manual/installation/usage.html

好吧,終於我實現了我想要做的事。 在閱讀了更多文檔並使用了新方法之后(有些問題是舊版本,Node版本<7.x),我終於使它起作用了。 我正在發布解決方案,以幫助可能在構建自己的腳本時遇到相同問題的人。

此方法使用async / await形式,因此請記住,必須將所有函數設置為async並將await設置為等待其內部結果的函數,這是與數據庫連接的函數的鏈到頂部。

 # 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,所以這是我能做到的最好的方法。 任何建議都會受到歡迎。

問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM