Node.js访问PostgreSQL的注意事项及解决方案
在操作node.js脚本访问PostgreSQL数据库时,使用INSERT和UPDATE功能未成功,调整后操作成功,及寻找到最终解决方案。
前序
NODE.JS加载pg模块,访问PostgreSQL数据库,数据库连接和查询功能都正常,使用插入记录INSERT和修改记录UPDATE时,报告找不到字段。
问题分析和解决
数据库里原本配置的字段名采用的都是大写,如:
测试脚本为:
var pg = require('pg');
var conString = "tcp://postgres:test@localhost/postgres";
var client = new pg.Client(conString);
client.connect(function(error, results){
if (error) {
console.log('clientConnectionReady Error:'+error.message);
client.end();
return;
}
else{
console.log('connection success...\n');
setTimeout(function(){
client.query("INSERT INTO dbtest (SN, NAME, PROP) VALUES('20220002', 'demo', '')", function (err, result) {
if (err) {
return console.error('error running query', err);
}
console.log(result);
});
},1000) ;
return;
}
});
从报错信息看到,报告字段找不到时,提及的是小写的字段名,而数据库中配置的是大写的字段名,因此推测是不是pg模块与PostgreSQL的配合问题,首先将数据库里的字段名改为小写:
调整脚本为:
var pg = require('pg');
var conString = "tcp://postgres:test@localhost/postgres";
var client = new pg.Client(conString);
client.connect(function(error, results){
if (error) {
console.log('clientConnectionReady Error:'+error.message);
client.end();
return;
}
else{
console.log('connection success...\n');
setTimeout(function(){
client.query("INSERT INTO dbtest (sn, name, prop) VALUES('20220002', 'demo', '')", function (err, result) {
if (err) {
return console.error('error running query', err);
}
console.log(result);
});
},1000) ;
return;
}
});
然后问题解决,插入记录成功,这里插入记录的脚本语句是双引号内包单引号。
注意事项
上面提及了用Node.js pg模块访问PostgreSQL,表格字段名需要为小写的问题, 并且数据库名也需要为小写。
有另外一个注意事项需要留意,在使用插入记录语句时,相同内容的脚本,采用单引号内包双引号产生访问失败:
var pg = require('pg');
var conString = "tcp://postgres:test@localhost/postgres";
var client = new pg.Client(conString);
client.connect(function(error, results){
if (error) {
console.log('clientConnectionReady Error:'+error.message);
client.end();
return;
}
else{
console.log('connection success...\n');
setTimeout(function(){
client.query('INSERT INTO dbtest (sn, name, prop) VALUES("20220002", "demo", "null")', function (err, result) {
if (err) {
return console.error('error running query', err);
}
console.log(result);
});
},1000) ;
return;
}
});
而如前所述,采用双引号内包单引号,则没有问题。
而对于查询语句,则单引号内包双引号没有问题,如:
client.query('SELECT "sn", "name" FROM "dbtest"', function (err, result) {
if (err) {
return console.error('error running query', err);
}
console.log(result);
});
因此,在使用Node.js的pg模块访问PostgreSQL数据库时,需要留意数据库名及字段名大小写问题和双引号单引号包含顺序问题。
实际上,数据库名和字段名出现大写会导致匹配问题,是因为PostgreSQL对数据库名和字段名的分析功能,如果是由双引号引起来的,则保持其大小写,如果不是由双引号引起来的,则将其调整为全小写。那么问题来了,如果数据库名和字段名部分用双引号引起来了,那么整个SQL语句还需要用引号包起来,如果用了单引号,如前所述,单引号内包双引号会出现问题,那么除了数据库名和字段名都用小写,没有解决方式了么?的确是有的!!
最终解决方案
要解决上面提到的问题,就要用到第三种引号,即反单引号,即位置在键盘左上角这个,而单引号和双引号在右侧同一个键位。
反单引号的作用域可高于双引号,因此,可以在将之用在SQL语句的最外面;而将双引号用在数据库名和字段名部分;剩下的单引号可以灵活配合进行使用,用在双引号内或双引号外。也就是由内外到内的使用顺序为`>">’ 。
按此解决方案,对如下有大写数据库名和字段名的操作则正常获得成功:
var pg = require('pg');
var conString = "tcp://postgres:test@localhost/postgres";
var client = new pg.Client(conString);
client.connect(function(error, results){
if (error) {
console.log('clientConnectionReady Error:'+error.message);
client.end();
return;
}
else{
console.log('connection success...\n');
setTimeout(function(){
client.query(`INSERT INTO "DBDEMO" ("INDEX", "CODE", "AUTH") VALUES('20220005', 'Insert', 'Test')`, function (err, result) {
if (err) {
return console.error('error running query', err);
}
console.log(result);
});
},1000) ;
return;
}
});
得到插入结果:
另外留意常规知识,在反单引号内可以引入变量,通过 ${变量名} 引入。
**
结论:通过三种引号的尽用,可以灵活正确的操作PostgreSQL数据库,不必受到大小写方面的问题约束。
**
–End–