我有一些.sql文件,其中有数千条INSERT语句,需要在我的PostgreSQL数据库上运行这些INSERT,以便将它们添加到表中。这些文件太大了,不可能打开它们并将INSERT语句复制到编辑器窗口中并在那里运行。我在网上发现,你可以通过导航到PostgreSQL安装的bin文件夹来使用以下方法:

psql -d myDataBase -a -f myInsertFile

在我的例子中:

psql -d HIGHWAYS -a -f CLUSTER_1000M.sql

然后我被要求为我的用户输入密码,但我不能输入任何东西,当我按enter键时,我得到这个错误:

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

为什么它不让我输入密码。是否有一种方法,因为它是至关重要的,我可以运行这些脚本?

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

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

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


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

Set the PGPASSWORD environment variable. For details see the manual: http://www.postgresql.org/docs/current/static/libpq-envars.html Use a .pgpass file to store the password. For details see the manual: http://www.postgresql.org/docs/current/static/libpq-pgpass.html Use "trust authentication" for that specific user: http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST Since PostgreSQL 9.1 you can also use a connection string: https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING


当然,您将得到一个致命的身份验证错误,因为您没有包括用户名…

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

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

如果数据库是远程的,则对host使用相同的命令

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

在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)

通过终端登录到您的数据库,并尝试这样做:

database-# >@pathof_mysqlfile.sql

or

database-#>-i pathof_mysqlfile.sql

or

database-#>-c pathof_mysqlfile.sql

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

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

postgres用户的密码将会显示。

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


你应该这样做:

\i path_to_sql_file

See:


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

使用此命令执行*。当PostgreSQL服务器位于不同的位置时:

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


您可以在命令行中使用“-d”参数同时提供用户名和密码

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

你甚至可以这样做:

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

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


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

\i fileName.sql

对于绝对路径和

\ir filename.sql

用于调用psql的相对路径。


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

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

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

我用的是: psql (PostgreSQL) 10.12 on (Ubuntu 10.12-0ubuntu0.18.04.1)


2021的解决方案

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

psql dbname < sqldump.sql username

如果是在线托管

psql -h hostname dbname < sqldump.sql username

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


@wingman__7在2021年的答案上有一个小改进:如果你的用户名包含某些字符(在我的例子中是下划线),你需要用-U标志来传递它。 这招对我很管用:

$ psql -h db.host -d db_name -U my_user < query.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

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

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