postgresql PG客户端错误:无法写入文件“base/pgsql_tmp/temp_file”

sq1bmfud  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(755)

我在node.js应用程序上使用node-postgres PG客户端从数据库查询数据,并将结果传递给express.js响应。这个很好用。然而,它需要一点时间来获得结果,并且宁愿创建一个cron作业来将结果保存在文件中。express API端点将把这个保存的文件作为响应传递。
使用fs.writeFilefs.createWriteStream执行此操作会引发PG Client Error: error: could not write to file "base/pgsql_tmp/pgsql_tmp6554.0": No space left on device
代码复制

  1. const { getData } = require("./pg_queries");
  2. const fs = require("fs");
  3. const cron = require("node-cron");
  4. const pull_and_save = async () => {
  5. fs.writeFile(
  6. "data/results.json",
  7. JSON.stringify(await getData()),
  8. { flag: "w+" },
  9. (err) => {
  10. if (err) console.log(err);
  11. }
  12. );
  13. }
  14. cron.schedule("* */10 * * * *", function () {
  15. pull_and_save();
  16. });

搜索一下这个问题,可能的解决方案是释放更多的磁盘空间
我的问题是为什么同样的Postgress查询可以用express而不是fs.writeFilefs.createWriteStream
express端点示例的代码段:

  1. const { getData } = require("./pg_queries");
  2. const app = express();
  3. app.get("/get-pg-data", async (req, res) => {
  4. const data = await getData();
  5. res.send(data);
  6. });
pgvzfuti

pgvzfuti1#

这个问题可以通过使用流将数据从PostgreSQL查询结果有效地复制到文件来解决。
试试这个代码;

  1. const { getData } = require("./pg_queries");
  2. const fs = require("fs");
  3. const cron = require("node-cron");
  4. const { Client } = require("pg");
  5. const copyTo = require("pg-copy-streams").to;
  6. const connectionString = "your-postgres-connection-string";
  7. const client = new Client({ connectionString });
  8. const pull_and_save = async () => {
  9. const query = getData(); // Assuming getData returns a query stream
  10. const stream = client.query(copyTo('COPY (' + query.text + ') TO STDOUT'));
  11. const fileStream = fs.createWriteStream("data/results.json");
  12. stream.pipe(fileStream);
  13. stream.on("end", () => {
  14. client.end();
  15. console.log("Data has been saved to data/results.json");
  16. });
  17. stream.on("error", (err) => {
  18. console.error("Error streaming data:", err);
  19. client.end();
  20. });
  21. };
  22. client.connect();
  23. cron.schedule("* */10 * * * *", function () {
  24. pull_and_save();
  25. });

它将数据从PostgreSQL查询结果复制到名为“data/results.json”的文件中,而cron作业则处理连接和错误。这种方法不需要使用过多的RAM。
希望它能起作用:)

展开查看全部

相关问题