提问人:Robouste 提问时间:11/12/2023 最后编辑:Robouste 更新时间:11/14/2023 访问量:67
Nodejs - 尝试执行 postgre sql 文件
Nodejs - Trying to execute postgre sql file
问:
我正在尝试通过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
答:
Postgres / libpq 具有一项功能,允许您将 psql 使用的凭据放在特定的“.pgpass”文件中
参见 https://www.postgresql.org/docs/current/libpq-pgpass.html
这可以帮助您,但代价是在文件系统上创建具有特定用户权限的文件。
根据项目和凭据所需的安全性,我建议您
- 使用前创建文件,psql操作完成后删除
- 为此任务创建具有受限权限的特定 Postgres 角色/用户。可以在操作之前和之后创建/删除此用户
请注意文档中的内容,否则它将不起作用:
在 Unix 系统上,密码文件的权限必须禁止任何 进入世界或团体;通过 chmod 0600 等命令实现此目的 ~/.pgpass。如果权限不如此严格,则文件将 被忽略。在 Microsoft Windows 上,假定该文件是 存储在安全的目录中,因此没有特殊权限检查 是制作的。
评论
.pgpass
如果您使用的密码是正确的,并且在提示符下输入密码时 psql 命令有效,则问题可能在于 PGPASSWORD 未正确设置。
在命令行中,尝试(no SET, no &&):
PGPASSWORD='mypassword' psql -U postgres -d dbName -f import.sql
这是我将 tmp env 变量传递给脚本的常用方法。如果您的密码中有单引号,则可能需要更多转义。
评论
我找到了解决方案!
如果我使用连接字符串进行连接,它就会起作用:
execSync(`psql -f ./download/import.sql "postgresql://postgres:myPassword@localhost/dbName"`);
格式如下:postgresql://<username>:<password>@<server>/<db>
评论
psql -U postgres -d dbName -f import.sql
nodejs
FATAL: password authentication failed for user "postgres"
\copy tableA from 'db/tableA'
\copy
psql
pg_hba.conf
export PGPASSWORD=mypassword