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

PG Client Error : could not write to file "base/pgsql_tmp/temp_file"

提问人:giddy 提问时间:9/24/2023 最后编辑:giddy 更新时间:9/25/2023 访问量:79

问:

我在 node.js 应用程序上使用 node-postgres PG 客户端从数据库中查询数据并将结果传递给 express.js 响应。这工作得很好。但是,获取结果需要一些时间,并且宁愿创建一个 cron-job 将结果保存在文件中。Express API 端点将此保存的文件作为响应传递。

使用或引发fs.writeFilefs.createWriteStreamPG 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 查询适用于 AND 而不是 OR ?expressfs.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);
});

PostgreSQL Postgres 节点 .js-fs

评论

0赞 jjanes 9/24/2023
对它在某些时间工作而不是在其他时间工作的简单解释是,有时有更多的可用空间,而其他时间则没有。

答:

0赞 Maimoona Abid 9/25/2023 #1

通过使用流式处理有效地将数据从 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。

希望它能:)