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

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

我在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
代码复制

const { getData } = require("./pg_queries"); 
const fs = require("fs");
const cron = require("node-cron");

const pull_and_save = async () => {
 fs.writeFile(
    "data/results.json",
    JSON.stringify(await getData()),
    { flag: "w+" },
    (err) => {
      if (err) console.log(err);
    }
  );
}

cron.schedule("* */10 * * * *", function () {
  pull_and_save();
});

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

const { getData } = require("./pg_queries"); 
const app = express();

app.get("/get-pg-data", async (req, res) => {
  const data = await getData();
  res.send(data);
});
pgvzfuti

pgvzfuti1#

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

const { getData } = require("./pg_queries");
const fs = require("fs");
const cron = require("node-cron");
const { Client } = require("pg");
const copyTo = require("pg-copy-streams").to;

const connectionString = "your-postgres-connection-string";
const client = new Client({ connectionString });

const pull_and_save = async () => {
  const query = getData(); // Assuming getData returns a query stream
  const stream = client.query(copyTo('COPY (' + query.text + ') TO STDOUT'));
  const fileStream = fs.createWriteStream("data/results.json");

  stream.pipe(fileStream);

  stream.on("end", () => {
    client.end();
    console.log("Data has been saved to data/results.json");
  });

  stream.on("error", (err) => {
    console.error("Error streaming data:", err);
    client.end();
  });
};

client.connect();

cron.schedule("* */10 * * * *", function () {
  pull_and_save();
});

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

相关问题