psql:严重:数据库“ <用户>”不存在


721

我正在使用Mac的PostgreSql应用程序(http://postgresapp.com/)。我过去在其他计算机上使用过它,但是在Macbook上安装时却给我带来了一些麻烦。我已经安装了应用程序,然后运行:

psql -h localhost

它返回:

psql: FATAL:  database "<user>" does not exist

看来我什至无法运行控制台来创建它要查找的数据库。当我刚运行时,会发生相同的事情:

psql 

或者,如果我从应用程序下拉菜单中启动psql:

机器统计:

  • OSX 10.8.4

  • psql(PostgreSQL)9.2.4

任何帮助表示赞赏。

我也尝试通过自制软件安装PostgreSql,但遇到了同样的问题。我还阅读了应用程序文档页面,其中指出:

首次启动Postgres.app时,它将创建$ USER数据库,该数据库为psql的默认数据库(未指定时)。默认用户为$ USER,没有密码。

因此,似乎该应用程序未在创建$ USER,但是我已经安装了-> uninstalled-reinstall了好几次了,所以它必须与我的机器有关。

我找到了答案,但是我不确定作为该线程的答案用户的工作方式->使Postgresql在Mac中运行:数据库“ postgres”不存在没有得到跟进。我使用以下命令来打开psql:

psql -d template1

在有人可以提供有关此功能的解释之前,我将不回答这一问题。


3
是什么psql -d postgres -U postgres -h localhost节目?没有标志,它默认为CLI用户,我会说它默认为“ postgres” admin db,但是我没有Mac可以测试。
bma

@bma这给了我psql:致命:角色“ postgres”不存在,最初是把我带到这里的-> stackoverflow.com/questions/15301826/…。我尝试使用该答案,但得到的结果相同-> psql:致命:数据库“用户”不存在
Ryan Rich

您是否看过数据库日志?我想知道是否会在那儿发出更多细节。
bma

12
我有同样的问题。只是createdb <user>为我工作。
poshaughnessy

以身份运行该命令psql -U user -d postgres,以确保,用户已连接到已经存在的postgres数据库。因此,我们还需要在登录时传递数据库。
尼尔,

Answers:


1172

您的软件包管理器似乎无法为您创建名为$ user的数据库。的原因

psql -d template1

为您工作的原因是template1是由postgres本身创建的数据库,并且存在于所有安装中。您显然可以登录template1,因此您必须具有数据库分配的某些权限。在shell提示符下尝试以下操作:

createdb

然后查看您是否可以再次登录

psql -h localhost

这只会为您的登录用户创建一个数据库,我想这就是您要寻找的数据库。如果createdb失败,则您没有足够的权限创建自己的数据库,因此您必须弄清楚如何修复自制程序包。


38
就我而言,我写信$ createdb -h localhost来解决这个错误could not connect to database postgres: could not connect to server。之后,我可以通过连接到postgresql控制台psql -h localhost
ExiRe 2014年

我仍然提示输入密码,不知道是哪个密码,哪个是默认的postgres应用密码?
LasagnaAndroid 2014年

2
谢谢@柯克。我们真的需要-d template1您的第一个命令吗?我在Internet上的所有教程中都看到过“ template1”,但这只会使我感到困惑。在我看来,一种更合乎逻辑的方法是:1)创建PostgreSQL用户,例如“ usera”; 2)创建一个与用户“ usera”同名的数据库(我认为这很疯狂,但是PostgreSQL似乎需要它)3)以超级用户“ postgres”的身份登录到PostgreSQL并将数据库“ usera”的特权分配给用户“ usera”(哦,我的天,这真的是现实生活吗?)
ericn

@eric:-d template1仅用于检查OP是否可以登录。由于它是在initdb时创建的,因此它一直存在,并且很容易检查。从那时起,您的程序通常就是“现实生活”。
Kirk Roybal

@ExiRe您刚刚用一个简单的命令就治好了我的头痛。谢谢!
戴夫·芒格

193

从终端,只需在命令提示符窗口中运行命令。 (不在psql中)

createdb <user>

然后尝试再次运行postgres。


3
美丽!做到了!运行此命令后,所有psql命令都可以正常运行!万分感谢!
博物学家,2016年

1
而且我正在尝试在psql模板中。该死的
user1735921

2
您也可以跑步createdb
Mantisimo '19

给像我这样的用户的提示;)(不在psql中)。意味着当您刚刚打开终端窗口时,只需输入createdb作为第一个命令,然后尝试登录psql。
Rohan Dodeja

大!在OSX上为我工作。
darkhipo

150

默认情况下,postgres尝试连接到与您的用户同名的数据库。为了防止这种默认行为,只需指定用户和数据库:

psql -U Username DatabaseName 

14
谢谢,您知道这种设计的原因吗-为什么我要在默认情况下进入my-name数据库?
ericn

3
eric数据库通常由以专用用户身份运行的服务使用。因此,我猜想使用用户名作为默认数据库名称的策略可能比使用某些固定的默认数据库名称(例如“ postgres”)更有用。
user686249

5
如何运行实际创建数据库的SQL脚本?在我的情况下,当我的目标是创建另一个DB时,它总是尝试连接到数据库<user>:psql -U Username -f create_db.sql这将返回错误:database Username doesn't exists
Kostanos

很棒的答案,谢谢,但是请问一个问题,为什么它不在命令行帮助中?psql --help
Shawn Vader

1
psql -U Username postgres当您还没有数据库时
Anatolii Stepaniuk

59
  1. 以默认用户身份登录: sudo -i -u postgres
  2. 创建新用户: createuser --interactive
  3. 当提示您输入角色名称时,输入linux用户名,然后选择是以回答超级用户问题。
  4. 仍以postgres用户身份登录,创建一个数据库: createdb <username_from_step_3>
  5. 通过psql在命令提示符下输入:确认错误已消失。
  6. 输出应显示 psql (x.x.x) Type "help" for help.

伙计,您节省了我很多时间。
Jp Reddy

我需要在Windows中执行此操作。将新的pg用户名设置为Linux un。固定。
RichieRich

这对我像魅力一样起作用
Promise Preston

41

使用默认的template1数据库登录:

#psql -d template1
#template1=# \l

  List of databases
   Name    |  Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
-----------+---------+----------+-------------+-------------+---------------------
 postgres  | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
 template1 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
(3 rows)

使用您的userId创建数据库:

template1=# CREATE DATABASE gogasca WITH OWNER gogasca ENCODING 'UTF8';
CREATE DATABASE

退出,然后再次登录

template1=# \q
gonzo:~ gogasca$ psql -h localhost
psql (9.4.0)
Type "help" for help.

gogasca=# \l
                                List of databases
   Name    |  Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
-----------+---------+----------+-------------+-------------+---------------------
 gogasca   | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
 template1 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
(4 rows)

20

尝试在Mac上打开Postgresql时遇到相同的错误

psql: FATAL:  database "user" does not exist

我找到了这个简单的命令来解决它:

方法1

$ createdb --owner=postgres --encoding=utf8 user

和类型

 psql

方法2:

psql -d postgres

5
方法2拯救了我的性命
tom10271 '17

9

有同样的问题,很简单psql -d postgres(在终端中键入命令)


6

如果环境变量PGDATABASE设置为不存在的数据库的名称,也会发生此错误。

在OSX上,尝试从Postgress.app菜单启动psql时看到以下错误:

psql: FATAL: database "otherdb" does not exist

解决该错误的方法是export PGDATABASE=otherdb~/.bash_profile

此外,如果PGUSER设置为用户名以外的其他名称,则会发生以下错误:

psql: FATAL: role "note" does not exist

解决的办法是去除export PGUSER=notme~/.bash_profile


5

Postgres的后期安装,在我的情况下是12.2,我确实运行了以下命令createdb

$ createdb `whoami`

$ psql

psql (12.2)
Type "help" for help.

macuser=# 

为我这个工作感到
高兴

4

由于此问题是搜索结果中的第一个问题,因此我将在此处针对其他问题提出不同的解决方案,以免出现重复的标题。

psql不指定数据库的情况下运行查询文件时,可能会出现相同的错误消息。由于usepostgresql中没有语句,因此我们必须在命令行上指定数据库,例如:

psql -d db_name -f query_file.sql

1
和db模板1总是存在

4

createdb文档所述:

初始化数据存储区时,始终由initdb命令创建第一个数据库。此数据库称为postgres。

因此,如果某些OS / postgresql发行版的做法不同,则肯定不是默认值/标准(刚刚验证,initdb在openSUSE 13.1上创建的数据库为“ postgres”,但不是“ <user>”)。长话短说,psql -d postgres预计将在使用除“ postgres”以外的用户时使用。

显然,可以接受的答案也可以运行createdb,但是它创建了一个多余的数据库。


1

在使用JDBC驱动程序时遇到了问题,因此仅需在URL中的主机名之后添加数据库(可能会冗余,具体取决于您使用的工具),例如 jdbc:postgres://<host(:port)>/<db-name>

此处记录了更多详细信息:http : //www.postgresql.org/docs/7.4/static/jdbc-use.html#JDBC-CONNECT


考虑到只要求使用psql,我知道这有点不合时宜,但是Google将我的问题带到了这里,所以我认为在这里值得一提
Andreas Dietrich 2014年



0

首先,创建一个与您当前使用的数据库名称相同的数据库将很有帮助,以防止在您只想使用默认数据库并创建新表而无需显式声明数据库名称的情况下发生错误。

将“ skynotify”替换为您的用户名:

psql -d postgres -c "CREATE DATABASE skynotify ENCODING 'UTF-8';"

-d显式声明将哪个数据库用作此交互式会话期间未显式包含数据库名称的SQL语句的默认数据库。

获得PostgresQL服务器所包含内容的清晰图片的基础。

您必须连接到现有数据库才能交互使用psql。幸运的是,您可以要求psql提供数据库列表:

psql -l

                                          List of databases
               Name               | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
----------------------------------+-----------+----------+-------------+-------------+-------------------
 skynotify                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 myapp_dev                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres                         | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ruby-getting-started_development | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/skynotify          +
                                  |           |          |             |             | skynotify=CTc/skynotify
 template1                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/skynotify          +
                                  |           |          |             |             | skynotify=CTc/skynotify
(6 rows)

这不会启动交互式控制台,它只是将基于文本的表输出到终端。

另一个答案是,postgres总是创建的,因此当您只想让控制台开始在其他数据库上工作时,应将其用作故障安全数据库。如果不存在,请列出数据库,然后使用其中任何一个。

以类似的方式,从数据库中选择表:

psql -d postgres -c "\dt;"

我的“ postgres”数据库没有表,但是任何这样做的数据库都会向终端输出基于文本的表(标准输出)。

为了完整起见,我们也可以从表中选择所有行:

psql -d ruby-getting-started_development -c "SELECT * FROM widgets;"

 id | name | description | stock | created_at | updated_at 
----+------+-------------+-------+------------+------------
(0 rows)

即使返回零行,您也将获得字段名称。

如果您的表有十几行,或者不确定,那么从行数开始以了解数据库中有多少数据会更有用:

 psql -d ruby-getting-started_development -c "SELECT count(*) FROM widgets;"

 count 
-------
     0
(1 row)

而且,不要说“ 1行”会让您感到困惑,它只是表示查询返回的行数,但是1行包含您想要的计数,在此示例中为0。

注意:在没有定义所有者的情况下创建的数据库将由当前用户拥有。


0

我尝试了其中一些解决方案,但是它们并没有奏效(尽管它们在正确的轨道上非常正确!)

最后,我的错误是:

严重:用户的密码身份验证失败

当我运行以下命令时: psql

因此,我运行了以下两个命令:

dropdb()
createdb()

注意:这删除数据库,但是我并不需要它,由于某种原因,我无法再访问pqsl,因此我删除并重新创建了它。然后psql再次工作。


0

不确定答案中是否已添加它,Anatolii Stepaniuk答案非常有帮助,以下是。

psql -U Username postgres # when you have no databases yet

-1

通过自制软件安装postgresql时出现此问题。

必须使用以下命令创建默认的“ postgres”超级用户:

createuser --interactive postgres对超级用户的回答是

createuser-超级用户的交互式用户答案y


-3

使用自制软件安装postgresql之后,我仍然遇到上述问题-我通过将/ usr / local / bin放在/ usr / bin之前的路径中来解决此问题


-12

用最简单的解释;这是菜鸟问题。只需输入

佩格里斯

将导致此响应。

pgres <db_name> 

如果用户具有访问数据库的权限,它将成功执行而不会出现错误。

可以查看导出的环境变量的详细信息,但这是不必要的..这太基本了,不能因为任何其他原因而失败。


5
真的不喜欢“ noob问题类型的语言”
Kimmo Hintikka

此外,它不建议如何解决问题,因此未回答问题。
德博拉

1
没听说过pgres
Glenn Plas '18
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.