Nodejs - 尝试执行 postgre sql 文件

Nodejs - Trying to execute postgre sql file

提问人:Robouste 提问时间:11/12/2023 最后编辑:Robouste 更新时间:11/14/2023 访问量:67

问:

我正在尝试通过nodejs运行以下命令:

psql -U postgres -d dbName -f import.sql

但我在控制台中得到了以下提示:

用户 postgres 的密码:

我尝试通过 environnment 变量设置密码,如下所示:

SET PGPASSWORD=mypassword && psql -U postgres -d dbName -f import.sql

但是由于某种原因,我收到以下错误:

psql:错误:连接到“localhost”(::1)的服务器,端口 5432 失败:致命:用户“postgres”的密码身份验证失败

我进行了三重检查,它是正确的密码,我还尝试更改密码以使用没有任何特殊字符的东西,怀疑编码问题,但仍然失败。

然后我尝试了,如下所示:node-postgres

const file = (await readFile("./download/import.sql")).toString();

const pool = new Pool({
  user: "postgres",
  host: "localhost",
  database: "dbName",
  password: "myPassword",
  port: 5432,
});

await pool.query(file);

但它失败了,因为我的脚本包含这样的行:我不知道如何解决这个问题。\copy tableA from 'db/tableA'

接下来,我尝试了 ,如下所示:spawn

const child = spawn("psql", ["-h", "localhost", "-U", "postgres", "-d", "dbName", "-f", "./download/import.sql"]);

child.stdin.write("myPassword");
child.stdin.end();

但是我仍然可以看到要求输入密码的提示。

我快想不到了

编辑: 我使用的是 Windows

节点.js postgresql nestjs 节点-pg-池

评论

1赞 Adrian Klaver 11/13/2023
1)这不是Postgres的命令行客户端。2)这意味着您使用了错误的密码。3) 这失败了,因为这是一个只有客户端才能理解的元命令。4) 在您的问题文本中添加 a) Postgres 版本 b) 文件的内容从以下行开始 # 类型数据库用户地址方法psql -U postgres -d dbName -f import.sqlnodejsFATAL: password authentication failed for user "postgres"\copy tableA from 'db/tableA'\copypsqlpg_hba.conf
0赞 cmucheru 11/13/2023
看起来您需要找到专门用于 Postgres 中设置的用户 postgres 的密码,并在运行 Postgres 命令时提供密码。
1赞 jjanes 11/13/2023
查看服务器的日志文件。除了密码错误之外,密码身份验证可能失败的原因还有其他,但未经身份验证的客户端不会获得有关该详细信息的信息。
0赞 Adrian Klaver 11/14/2023
这不应该吗?export PGPASSWORD=mypassword
0赞 Robouste 11/14/2023
我在 Windows 上,我已经更新了这个问题

答:

0赞 Jerome WAGNER 11/13/2023 #1

Postgres / libpq 具有一项功能,允许您将 psql 使用的凭据放在特定的“.pgpass”文件中

参见 https://www.postgresql.org/docs/current/libpq-pgpass.html

这可以帮助您,但代价是在文件系统上创建具有特定用户权限的文件。

根据项目和凭据所需的安全性,我建议您

  • 使用前创建文件,psql操作完成后删除
  • 为此任务创建具有受限权限的特定 Postgres 角色/用户。可以在操作之前和之后创建/删除此用户

请注意文档中的内容,否则它将不起作用:

在 Unix 系统上,密码文件的权限必须禁止任何 进入世界或团体;通过 chmod 0600 等命令实现此目的 ~/.pgpass。如果权限不如此严格,则文件将 被忽略。在 Microsoft Windows 上,假定该文件是 存储在安全的目录中,因此没有特殊权限检查 是制作的。

评论

0赞 Adrian Klaver 11/14/2023
这实际上不适用于该问题,因为问题在于提供的密码不正确。输入不正确的密码并不能神奇地解决该问题。.pgpass
0赞 Jerome WAGNER 11/14/2023
@Adrian Klaver,我同意这可能是一个 pg_hba.conf 问题,但我认为他知道正确的密码,并且在提示符下输入密码会导致正确的导入。
0赞 Jerome WAGNER 11/14/2023 #2

如果您使用的密码是正确的,并且在提示符下输入密码时 psql 命令有效,则问题可能在于 PGPASSWORD 未正确设置。

在命令行中,尝试(no SET, no &&):

PGPASSWORD='mypassword' psql -U postgres -d dbName -f import.sql

这是我将 tmp env 变量传递给脚本的常用方法。如果您的密码中有单引号,则可能需要更多转义。

评论

0赞 Robouste 11/14/2023
已经试过了,也没有用:/我猜你在 Linux 上?我在 Windows 上
1赞 Jerome WAGNER 11/15/2023
是的,我没有适用于 Windows 的解决方案。如果要使用与找到的连接字符串解决方案不同的内容,请在 stackoverflow.com/questions/6216432/...
0赞 Robouste 11/14/2023 #3

我找到了解决方案!

如果我使用连接字符串进行连接,它就会起作用:

execSync(`psql -f ./download/import.sql "postgresql://postgres:myPassword@localhost/dbName"`);

格式如下:postgresql://<username>:<password>@<server>/<db>