使用命令行参数运行 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 < 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 错误的最佳方法?