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


540

我有一些.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

通常可以在PostgreSQL安装的'data'文件夹中找到pg_hba.conf文件。


6
您已经有了答案,但以防万一...“我什么都不能输入”,您是否在谈论输入密码不显示任何事实?这是正常的在这种情况下,正常输入密码并按下回车键应该工作...
伊夫琳Lachance

安装ITIS的副本(itis.gov)时遇到类似的问题。该数据库不存在,所以我无法使用其名称。由于PostgreSQL的工作方式,我可以这样做:psql --port = 5554 --username = root --file = ITIS.sql template1
Cyber​​knight

Answers:


157

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

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

你好 我现在将设置设置为“信任”,但是我注意到该软件正在尝试使用Windows用户名进行登录。我想使用我在Postgresql数据库中设置的角色。有没有办法告诉它使用哪个角色来运行命令?
CSharpened 2012年

2
@CSharpened:使用-u手册中记录的参数
a_horse_with_no_name 2012年

#2非常简单。只需将包含host:port:db:user:pass的一行添加到文件中即可。辛苦了
克里尔,2016年

493

当然,由于您不包括用户名,因此在身份验证时会遇到致命错误...

试试这个,对我来说是可以的:)

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

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

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

4
请注意,提供的用户名必须是有效的postgres角色。默认值为当前登录的用户。
matthias krull 2012年

8
为什么选择-a参数?
AlikElzin-kilaka,

5
-a在这里不需要@ AlikElzin-kilaka 。它是“在读取所有非空输入
行时

这应该是公认的答案。
Kostanos

316

您应该这样做:

\i path_to_sql_file

看到:

在此处输入图片说明


2
我知道了Permission denied
扎克

4
经过修正后的chmod 777 myfile错误Permission denied得到了解决
Ulug'bek Ro'zimboyev

5
@Zac如果您的许可被拒绝在Windows计算机上发生,则您可能使用了错误的斜杠。
pgsandstrom

2
我在Windows上遇到此错误,事实证明是斜杠,如@pgsandstrom所述。错误的斜杠=改用正斜杠,并且在路径上不加引号。\ ic:/dev/script.sql
Dave

50

当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提供的评论进行更新


5
@ ChickenWing24 -a:所有回显,-q:安静,-f:文件
zwacky

这个解决了我自己的问题,太好了
Temi'Topsy'Bello,

45
export PGPASSWORD=<password>
psql -h <host> -d <database> -U <user_name> -p <port> -a -w -f <file>.sql

1
我该怎么办却没有输出
Lu32

2
psql -h <主机> -d <数据库> -U <用户名> -p <端口> -a -q -w -f <文件> .sql
vishu9219 2016年

3
@ Lu32您还可以省略标志-a(这意味着“在读取所有非空输入行时将它们打印到标准输出中”)。经过EDIT测试,没有-a的情况下打印的内容较少,但信息仍然过多。因此,如vishu9219所说,-q标志是正确的。
Rauni Lillemets '16

41

如果您在Linux Shell上登录到psql,则命令为:

\i fileName.sql

绝对路径和

\ir filename.sql

用于从中调用psql的相对路径。


正如@Florian所说,登录后即可执行文件。记住要在SQL中将注释行标记为以下两种方式之一:-注释到行尾a)-一行注释或b)/ *多行注释* /
Sumit S

26

通过终端登录到数据库,然后尝试以下操作:

database-# >@pathof_mysqlfile.sql

要么

database-#>-i pathof_mysqlfile.sql

要么

database-#>-c pathof_mysqlfile.sql

对于我来说,这种解决方案更可靠;不是标为
answe

16

您可以在命令行本身上输入用户名和PASSSWORD。

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

如果您不想设置环境变量或使用奇怪的传递文件,则此方法有效。=)
马丁

13

您甚至可以通过以下方式进行操作:

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

如果您sudo可以在计算机上访问,并且不建议将其用于生产脚本,而只是在自己的计算机上进行测试,则这是最简单的方法。


9

逐步了解如何在Linux上的PostgreSQL命令行上运行SQL:

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

psql --version
which psql

我的是9.1.6版,位于/bin/psql

创建一个纯文本文件,名为 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。总是输入错误的密码
-mKane

4

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

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

Password for user postgres: 会出现。

输入密码并输入。我看不到我输入的密码,但是这次按Enter可以。实际上,我正在将数据加载到数据库中。


我认为您的意思是-d "postgres"
amphetamachine

@amphetamachine -d 获取数据库名称,请检查psql --help
Yaz

1

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

::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,然后退出。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.