我正在尝试连接到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()
,但是没有执行。我打印了在pgAdmin
上传递给 pool.query 的字符串上形成的所有SQL查询,并且所有SQL查询都正常工作并返回我想要的预期值。
我做错了什么?
谢谢!
---编辑---
感谢您的回答,但我仍然无法使其发挥作用。我尝试了两种方法,但它不起作用。看Documentation我正在尝试这种方法。
代码是:
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上执行了查询工作正常,返回了我期望的结果,但似乎尝试在脚本上执行查询并不起作用。
我缺少什么?感谢。
答案 0 :(得分:1)
你也可以使用" 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);
});
});
答案 1 :(得分:0)
你可以使用PostgreSQL的sequelize。它在Node.js中非常好的对象关系映射(ORM)。
const sequelize = new Sequelize('database','username','password',{ // gimme postgres,拜托! 方言:'postgres' })
有关详细信息,请查看以下链接。 http://docs.sequelizejs.com/manual/installation/usage.html
答案 2 :(得分:0)
好吧,最后我确实实现了我想做的事情。在阅读了更多documentation并使用新方法(一些问题有旧版本,Node版本< 7.x)后,我终于使它工作了。我发布了解决方案,以帮助可能在构建自己的脚本时遇到同样问题的人。
此方法使用async / await表单,因此请记住,您必须将所有函数设置为 async 并将等待设置为函数等待内部结果,它是从与DB连接到顶部的函数链。
# 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;
}
&#13;
我不知道这是否是实现我想要的最佳方式,但由于我被迫使用NodeJS并且我自己学习NodeJS,这是我能做到的最好。任何建议都会很受欢迎。
问候。