如何从 node.js 中的 postgresql 脚本中读取

Posted

技术标签:

【中文标题】如何从 node.js 中的 postgresql 脚本中读取【英文标题】:How to read from postgresql script in node.js 【发布时间】:2021-09-14 03:47:48 【问题描述】:

我使用 pg 模块将 postgres 数据库连接到 node.js 项目。

const pg = require('pg')
const pool = pg.Pool(

  "user":"postgres",
  "password":"password",
  "host": "localhost",
  "db" : "db1"
);

pool.connect();

pool.on('connect',(client)=>

client.query("insert into table1(id, name) values(1, "item1")")
   client.query("select * from table 1",(err, res)=>
     if( err) throw err;
     console.log(res);
   );

)

我的 sql 代码在一个名为 script.sql 的文件中。我的代码与上面非常相似,我想从 script.sql 文件中读取,而不是将 sql 代码放入查询函数中,例如 client.query("insert into table1(id, name) values(1, 'item1') ") 。有没有办法在 pg 模块中做到这一点,或者你有没有建议一种有效的方法来从 node-postgres 中的脚本中读取。

【问题讨论】:

“从脚本中读取”是什么意思 可以将文件读入变量。可以在服务器启动前使用readFileSync,也可以在服务器启动后使用readFile 【参考方案1】:

你要么synchronously read服务器启动前的文件(readFileSync阻塞服务器):

const pg = require('pg');
const  readFileSync  = require('fs');

const sqlInsert = readFileSync('insert.sql');
const sqlSelect = readFileSync('select.sql');

const pool = pg.Pool(
  "user":"postgres",
  "password":"password",
  "host": "localhost",
  "db" : "db1"
);

pool.connect();

pool.on('connect', client => 
  client.query(sqlInsert);
  client.query(sqlSelect, (err, res) => 
    if (err) throw err;
    console.log(res);
  );
);

或asynchronously read服务器启动后的文件:

const pg = require('pg');
const  readFile  = require('fs');

const pool = pg.Pool(
  "user":"postgres",
  "password":"password",
  "host": "localhost",
  "db" : "db1"
);

pool.connect();

pool.on('connect', client => 
  readFile('insert.sql', sqlInsert => 
    client.query(sqlInsert);
  );
  readFile('select.sql', sqlSelect => 
    client.query(sqlSelect, (err, res) => 
      if (err) throw err;
      console.log(res);
    );
  );
);

您也可以使用promise-based operations 代替基于回调的操作:

const pg = require('pg');
const  readFile  = require('fs/promises');

const pool = pg.Pool(
  "user":"postgres",
  "password":"password",
  "host": "localhost",
  "db" : "db1"
);

pool.connect();

pool.on('connect', async client => 
  await sqlInsert = readFile('insert.sql');
  client.query(sqlInsert);
  await sqlInsert = readFile('select.sql')
  client.query(sqlSelect, (err, res) => 
    if (err) throw err;
    console.log(res);
  );
);

【讨论】:

以上是关于如何从 node.js 中的 postgresql 脚本中读取的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 中的 PostgreSQL 多行更新

使用 Node JS 连接到在线托管的 PostgreSQL

Node.js、PostgreSQL 中的事务冲突、乐观并发控制和事务重试

如何将在 zeit 中运行的 node.js 与 postgresql 连接起来?

将嵌套的 JSON 从 PostgreSQL 的多对多连接表返回到 node.js

如何删除多行 typeorm - postgresql 和 node.js(typescript)