我尝试通过nodejs运行以下命令:
第一个月
但我在控制台中得到了以下提示:
用户postgres的密码:
我试着通过参数变量设置密码,像这样:SET PGPASSWORD=mypassword && psql -U postgres -d dbName -f import.sql
个
但由于某种原因,我得到了以下错误:
psql:error:connection to server at“localhost”(::1),port 5432 failed:FATAL:password authentication failed for user“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
3条答案
按热度按时间lvmkulzt1#
PostgreSQL/ libpq有一个特性,允许您将psql使用的凭据放在特定的“.pgpass”文件中
cf https://www.postgresql.org/docs/current/libpq-pgpass.html
这可以帮助您在文件系统上创建具有特定用户权限的文件。
根据项目和凭证所需的安全性,我建议您
请注意文档中的说明,否则它将无法工作:
在Unix系统上,密码文件的权限必须禁止对world或group的任何访问;可以通过chmod 0600 ~/. pgpass这样的命令来实现这一点。如果权限不那么严格,则该文件将被忽略。在Microsoft Windows上,假定该文件存储在安全的目录中,因此不进行特殊的权限检查。
cgvd09ve2#
如果您使用的密码是正确的,并且当您在提示符下输入密码时psql命令可以工作,那么问题可能是PGPASSWORD设置不正确。
在命令行中,尝试(no SET,no &&):
PGPASSWORD='mypassword' psql -U postgres -d dbName -f import.sql
这是我传递一个临时环境变量给脚本的常用方法。2如果你的密码中有单引号,这可能需要更多的转义。
vwhgwdsa3#
我找到解决办法了!
如果我使用连接字符串进行连接,它就可以工作:
字符串
格式:
postgresql://<username>:<password>@<server>/<db>