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

Posted

技术标签:

【中文标题】使用命令行参数运行 PostgreSQL .sql 文件【英文标题】:Run a PostgreSQL .sql file using command line arguments 【发布时间】:2012-04-01 22:14:01 【问题描述】:

我有一些 .sql 文件,其中包含数千个 INSERT 语句,需要在我的 PostgreSQL 数据库上运行这些插入,以便将它们添加到表中。这些文件太大以至于无法打开它们并将 INSERT 语句复制到编辑器窗口并在那里运行它们。我在 Internet 上发现,您可以通过导航到 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 安装的“数据”文件夹中找到。

【问题讨论】:

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

当然,验证时会出现致命错误,因为您没有包含用户名...

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

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

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

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

【讨论】:

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

你应该这样做:

\i path_to_sql_file

见:

【讨论】:

我收到Permission denied 在执行chmod 777 myfile 错误Permission denied 后已修复 @Zac 如果您的 Permission denied 发生在 Windows 机器上,您可能使用了错误的斜杠。 我在 Windows 上遇到了这个错误,结果是斜线,正如@pgsandstrom 提到的那样。错误的斜杠 = 改用正斜杠,并且路径上没有引号。 \ic:/dev/script.sql【参考方案3】:

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

    设置 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开始你也可以use a connection string:https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING

【讨论】:

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

当 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:文件 这在没有数据库的情况下可以工作吗?我正在尝试使用此工具在现有服务器中创建新数据库。【参考方案5】:

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

\i fileName.sql

对于绝对路径和

\ir filename.sql

获取您调用 psql 的相对路径。

【讨论】:

正如@Florian 所说,一旦登录,您就可以执行文件。请记住将 SQL 中的任何注释行标记为两种方式中的任何一种...-- 注释到行尾 a) -- 一行注释或 b) /* 多行 cmets */【参考方案6】:
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 (这意味着“将所有非空输入行在读取时打印到标准输出”)。 EDIT 测试,没有 -a 它打印出更少,但仍然太多的信息。所以 -q 标志是正确的,正如 vishu9219 所说。【参考方案7】:

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

database-# >@pathof_mysqlfile.sql

database-#>-i pathof_mysqlfile.sql

database-#>-c pathof_mysqlfile.sql

【讨论】:

这个解决方案对我来说更可靠;不是标记为回答的那个【参考方案8】:

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

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

【讨论】:

如果您不想设置环境变量或使用奇怪的 pass 文件,这很有效。 =) 这应该是公认的答案,谢谢【参考方案9】:

你甚至可以这样做:

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

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

【讨论】:

【参考方案10】:

演练如何在 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 。总是说密码错误【参考方案11】:

2021 解决方案

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

psql dbname < sqldump.sql username

如果它是在线托管的

psql -h hostname dbname < sqldump.sql username

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

【讨论】:

是否依赖于操作系统? @BingLi224 我使用的是 Windows 系统,我很确定它不依赖于操作系统。 最佳答案。适用于 Ubuntu/Debian 系统。如果您从具有更改数据库权限的用户运行它,您甚至可以省略username 部分,所以它只是psql dbname &lt; sqldump.sql @Neurotransmitter true,这也可以。【参考方案12】:

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

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

Password for user postgres: 会出现。

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

【讨论】:

我想你的意思是-d "postgres" @amphetamachine -d 数据库名称,检查psql --help【参考方案13】:
psql -h localhost -d userstoreis -U admin -p 5432 -a -q -f /home/jobs/Desktop/resources/postgresql.sql

-h PostgreSQL 服务器 IP 地址 -d 数据库名称 -U 用户名 -p PostgreSQL 服务器正在监听的端口 -f SQL 脚本的路径 -a 所有回声 -q 安静

【讨论】:

【参考方案14】:

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

::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 其中@ 987654328@ 回显脚本中的所有输入,-f 将来自file.sql 的命令执行到mydatabase,然后退出。

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

【讨论】:

【参考方案15】:

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

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

【讨论】:

以上是关于使用命令行参数运行 PostgreSQL .sql 文件的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 中带参数的 SQL 视图,防止运行时 SQL 错误的最佳方法?

命令行下更好显示 postgresql 的查询结果

PostgreSQL各命令行工具功能说明

PostgreSQL安装及使用教程

如何为 gradle 任务命令行参数提供 flyway 密码?

从命令行导入 PostgreSQL CSV