ChatGPT解决这个技术问题 Extra ChatGPT

使用命令行参数运行 PostgreSQL .sql 文件

我有一些 .sql 文件,其中包含数千个 INSERT 语句,需要在我的 PostgreSQL 数据库上运行这些插入,以便将它们添加到表中。这些文件太大以至于无法打开它们并将 INSERT 语句复制到编辑器窗口并在那里运行它们。我在 Internet 上发现,您可以通过导航到 PostgreSQL 安装的 bin 文件夹来使用以下内容:

psql -d myDataBase -a -f myInsertFile

就我而言:

psql -d HIGHWAYS -a -f CLUSTER_1000M.sql

然后我被要求为我的用户输入密码,但我无法输入任何内容,当我按 Enter 时出现此错误:

psql:致命:用户“myUsername”的密码验证失败

为什么不让我输入密码。有没有办法解决这个问题,因为我可以运行这些脚本很重要?

我通过在我的 pg_hba.conf 文件中添加一个具有以下结构的新条目来解决这个问题:

# IPv6 local connections:
host    myDbName    myUserName ::1/128    trust

pg_hba.conf 文件通常可以在 PostgreSQL 安装的“数据”文件夹中找到。

您已经得到了答案,但以防万一……“我无法输入任何内容”,您可能是在谈论输入密码不会显示任何内容的事实吗?在这种情况下这是正常的,通常输入密码并按 Enter 应该可以工作......
我在安装 ITIS (itis.gov) 的副本时遇到了类似的问题。该数据库不存在,所以我无法使用它的名称。由于 PostgreSQL 的工作方式,我可以这样做: psql --port=5554 --username=root --file=ITIS.sql template1

Y
Yash Sharma

当然,你会得到一个验证的致命错误,因为你没有包含用户名......

试试这个,对我来说没问题:)

psql -U username -d myDataBase -a -f myInsertFile

如果数据库是远程的,使用与主机相同的命令

psql -h host -U username -d myDataBase -a -f myInsertFile

请注意,提供的用户名必须是有效的 postgres 角色。默认是当前登录的用户。
为什么是 -a 参数?
@AlikElzin-kilaka -a 这里不需要。它是“在读取所有非空输入行时将它们打印到标准输出”
P
Peter Mortensen

你应该这样做:

\i path_to_sql_file

看:

https://i.stack.imgur.com/oLP8E.png


我得到Permission denied
修复了 chmod 777 myfile 错误 Permission denied
@Zac 如果您的 Permission denied 发生在 Windows 机器上,您可能使用了错误的斜杠。
正如@pgsandstrom 提到的,我在 Windows 上遇到了这个错误,结果证明是斜线。错误的斜杠 = 改用正斜杠,并且路径上没有引号。 \ic:/dev/script.sql
P
Peter Mortensen

您有四种选择来提供密码:

设置 PGPASSWORD 环境变量。有关详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/libpq-envars.html 使用 .pgpass 文件存储密码。有关详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/libpq-pgpass.html 为该特定用户使用“信任身份验证”:http://www.postgresql.org/docs/current /static/auth-methods.html#AUTH-TRUST 从 PostgreSQL 9.1 开始,您还可以使用连接字符串:https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING


你好。我现在已将设置设置为信任,但我注意到该软件正在尝试使用我的 Windows 用户名登录。我想使用我在我的 Postgresql 数据库中设置的角色。有没有办法告诉它使用哪个角色来运行命令?
@CSharpened:使用手册中记录的 -u 参数
#2 非常简单。只需将包含 host:port:db:user:pass 的一行添加到文件中即可。不错的作品。
c
cegas

当 PostgreSQL 服务器位于不同的地方时,使用它来执行 *.sql 文件:

psql -h localhost -d userstoreis -U admin -p 5432 -a -q -f /home/jobs/Desktop/resources/postgresql.sql

-h PostgreSQL server IP address
-d database name
-U user name
-p port which PostgreSQL server is listening on
-f path to SQL script
-a all echo
-q quiet

然后会提示您输入用户的密码。

编辑:根据@zwacky 提供的评论更新


@ChickenWing24 -a:所有回声,-q:安静,-f:文件
这在没有数据库的情况下工作吗?我正在尝试使用此工具在现有服务器中创建新数据库。
F
Florian

如果您在 Linux shell 上登录 psql,命令是:

\i fileName.sql

对于绝对路径和

\ir filename.sql

对于您调用 psql 的相对路径。


正如@Florian 所说,一旦登录,您就可以执行文件。请记住将 SQL 中的任何注释行标记为两种方式中的任何一种...-- 注释到行尾 a) -- 一行注释或 b) /* 多行注释 */
哇,非常感谢,运行得很好。
A
Alban
export PGPASSWORD=<password>
psql -h <host> -d <database> -U <user_name> -p <port> -a -w -f <file>.sql

我怎么能在没有输出的情况下做到这一点
psql -h <主机> -d <数据库> -U <用户名> -p <端口> -a -q -w -f <文件>.sql
@Lu32您也可以省略标志 -a (这意味着“在读取所有非空输入行时将它们打印到标准输出”)。编辑测试,没有 -a 它打印出更少,但仍然太多的信息。所以 -q 标志是正确的,正如 vishu9219 所说。
P
Peter Mortensen

通过终端登录到您的数据库并尝试以下操作:

database-# >@pathof_mysqlfile.sql

或者

database-#>-i pathof_mysqlfile.sql

或者

database-#>-c pathof_mysqlfile.sql

这个解决方案对我来说更可靠;不是标记为回答的那个
D
Deepu Sahni

您可以在命令行本身上同时提供用户名和密码。

   psql "dbname='urDbName' user='yourUserName' password='yourPasswd' host='yourHost'" -f yourFileName.sql

如果您不想设置环境变量或使用奇怪的 pass 文件,这很有效。 =)
这应该是公认的答案,谢谢
R
Ravinder Reddy

你甚至可以这样做:

sudo -u postgres psql -d myDataBase -a -f myInsertFile

如果您在机器上具有 sudo 访问权限,并且不建议将其用于生产脚本,仅用于在您自己的机器上进行测试,那么这是最简单的方法。


P
Peter Mortensen

演练如何在 Linux 中的 PostgreSQL 命令行上运行 SQL:

打开终端并确保您可以运行 psql 命令:

psql --version
which psql

我的是位于 /bin/psql 中的 9.1.6 版。

创建一个名为 mysqlfile.sql 的纯文本文件

编辑那个文件,在里面放一行:

select * from mytable;

在命令行上运行此命令(将您的用户名和数据库名称替换为 pgadmin 和 kurz_prod):

psql -U pgadmin -d kurz_prod -a -f mysqlfile.sql

以下是我在终端上得到的结果(没有提示我输入密码):

select * from mytable;

test1
--------
hi
me too

(2 rows)

你如何设置用户?这是我第一次在新的 .sql 文件上安装和运行 -f 。总是说密码错误
w
wingman__7

2021解决方案

如果您的 PostgreSQL 数据库在本地系统上。

psql dbname < sqldump.sql username

如果它在线托管

psql -h hostname dbname < sqldump.sql username

如果您有任何疑问或问题,请在评论中提出。


它依赖于操作系统吗?
@BingLi224 我使用的是 Windows 系统,我很确定它不依赖于操作系统。
最佳答案。适用于 Ubuntu/Debian 系统。如果您从具有更改数据库权限的用户运行它,您甚至可以省略 username 部分,因此它只是 psql dbname < sqldump.sql
@Neurotransmitter 是的,这也可以。
b
blurfus
psql -h localhost -d userstoreis -U admin -p 5432 -a -q -f /home/jobs/Desktop/resources/postgresql.sql

参数说明:

-h PostgreSQL server IP address
-d database name
-U user name
-p port which PostgreSQL server is listening on
-f path to SQL script
-a all echo
-q quiet

P
Peter Mortensen

您可以打开命令提示符并以管理员身份运行。然后输入

../bin>psql -f c:/...-h localhost -p 5432 -d databasename -U "postgres"

Password for user postgres: 将出现。

输入您的密码并输入。我看不到我输入的密码,但这次当我按下回车键时它起作用了。实际上我正在将数据加载到数据库中。


我想你的意思是-d "postgres"
@amphetamachine -d 对于数据库名称,检查 psql --help
P
PaulShovan

我实现了所写的(位于我的脚本所在的目录中)

::someguy@host::$sudo -u user psql -d my_database -a -f file.sql 

其中 -u user 是拥有我要执行脚本的数据库的角色,然后 psql 连接到 psql 控制台,之后 -d my_database 将我加载到 mydatabase 最后 -a -f file.sql 其中 -a 回显脚本和 -f 的所有输入将 file.sql 中的命令执行到 mydatabase,然后退出。

我正在使用: psql (PostgreSQL) 10.12 on (Ubuntu 10.12-0ubuntu0.18.04.1)


j
jmm

@wingman__7 的 2021 年答案的一个小改进:如果您的用户名包含某些字符(在我的情况下是下划线),您需要使用 -U 标志传递它。
这对我有用:

$ psql -h db.host -d db_name -U my_user < query.sql 

l
lemon

尝试在命令行控制台中使用以下命令:

psql -h localhost -U postgres -f restore.sql