Node.js访问PostgreSQL的注意事项及解决方案

本文详细介绍了在使用Node.js的pg模块访问PostgreSQL数据库时遇到的大写字段名匹配问题及解决方案。问题源于数据库字段名与SQL语句中的字段名大小写不一致。解决方案包括将字段名改为小写,以及使用反单引号来正确包裹SQL语句,确保双引号内的字段名保持大小写。此外,文章还提醒注意在不同场景下单引号和双引号的使用规则。
摘要由CSDN通过智能技术生成

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–

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PegasusYu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值