psql: FATAL:数据库"<user>"不存在

我正在为mac(http://postgresapp.com/)使用PostgreSql应用程序。我过去曾在其他机器上使用过它,但在我的macbook上安装时遇到了一些麻烦。我已经安装了应用程序并运行了:

psql -h localhost

它返回:

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

似乎我甚至无法运行控制台来创建它试图查找的数据库。当我刚刚运行时,会发生同样的事情:

psql

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

机器统计:

  • OSX10.8.4

  • psql(PostgreSQL)9.2.4

任何帮助都是感激的。

我也尝试通过自制安装PostgreSql,我也遇到了同样的问题。我还阅读了应用程序留档页面,上面写着:

当Postgres.app第一次启动时,它会创建$USER数据库,当未指定时,这是psql的默认数据库。该默认用户是$USER,没有密码。

所以看起来应用程序没有创建$USER,但是我已经安装->卸载-重新安装了几次,所以它一定是我的机器上的东西。

我找到了答案,但我不确定它是如何工作的,因为在此线程上回答->在Mac中运行PostgreSQL:数据库“postgres”不存在的用户没有跟进。我使用以下命令打开psql:

psql -d template1

我会留下这个答案,直到有人能解释为什么这是有效的。

543433 次浏览

看来您的包管理器未能为您创建名为$user的数据库。原因是

psql -d template1

适用于您的是template1是由postgres本身创建的数据库,并且存在于所有安装中。您显然能够登录template1,因此您必须拥有数据库分配给您的一些权限。在shell提示符下尝试此操作:

createdb

然后看看你是否可以再次登录

psql -h localhost

这将简单地为您的登录用户创建一个数据库,我认为这就是您正在寻找的。如果createdb失败,那么您没有足够的权限来制作自己的数据库,您将不得不弄清楚如何修复自制包。

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

psql -U Username DatabaseName

在使用自制安装postgreql后,我仍然有上面的问题-我通过在 /usr/bin之前将 /usr/local/bin放在我的路径中来解决它

由于这个问题是搜索结果中的第一个问题,我将在这里为不同的问题提供不同的解决方案,以避免重复标题。

psql中运行查询文件而不指定数据库时,也会出现相同的错误消息。由于postgresql中没有use语句,我们必须在命令行上指定数据库,例如:

psql -d db_name -f query_file.sql

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

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

psql: FATAL: database "otherdb" does not exist

错误的解决方案是从~/.bash_profile中删除export PGDATABASE=otherdb

此外,如果PGUSER设置为您的用户名以外的内容,则会发生以下错误:

psql: FATAL: role "note" does not exist

解决方案是从~/.bash_profile中删除export PGUSER=notme

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

更多细节记录在这里:http://www.postgresql.org/docs/7.4/static/jdbc-use.html#JDBC-CONNECT

  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.

使用默认template1数据库登录:

#psql -d template1#template1=# \l
List of databasesName    |  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/gogascatemplate1 | 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=# \qgonzo:~ gogasca$ psql -h localhostpsql (9.4.0)Type "help" for help.
gogasca=# \lList of databasesName    |  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/gogascatemplate1 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +|         |          |             |             | gogasca=CTc/gogasca(4 rows)

createdb留档所示:

第一个数据库总是在初始化数据存储区域时由initdb命令创建……这个数据库称为postgres。

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

显然,接受的答案是,运行createdb创建一个像用户一样命名的数据库,也可以工作,但会创建一个多余的数据库。

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

createdb <user>

然后尝试再次运行postgres。

这是一个基本的误解。简单地输入:

pgres

将导致此响应:

pgres <db_name>

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

可以深入了解导出的环境变量的细节,但这是不必要的……这太基本了,不能因为任何其他原因而失败。

首先,创建一个与当前用途相同的数据库很有帮助,以防止在只想使用默认数据库并创建新表而不显式声明数据库名称时出错。

用您的用户名替换“Sky通知”:

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

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

清楚地了解PostgreQL服务器中包含的内容的基础。

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

psql -l

.

                                          List of databasesName               | 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/skynotifytemplate1                        | 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。

注意:没有定义所有者的数据库将由当前用户拥有。

当我尝试在mac上打开postgresql时,我遇到了同样的错误

psql: FATAL:  database "user" does not exist

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

方法1

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

和类型

 psql

方法二:

psql -d postgres

通过自制安装postgresql时遇到此问题。

必须创建默认的“postgres”超级用户:

createuser--交互式postgres为超级用户回答y

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

有同样的问题,一个简单的psql -d postgres做到了(在终端中键入命令)

通过现有超级用户连接到postgres。

根据您连接到postgres的用户名创建数据库。

create database username;

现在尝试通过用户名连接

试试用

psql -d postgres

当我跑psql时,我也面临着同样的问题

不确定它是否已经添加在答案中,Anatolii Stepaniuk的回答非常有帮助,如下所示。

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

安装postgres后,在我的情况下版本是12.2,我确实运行了下面的命令createdb

$ createdb `whoami`
$ psql
psql (12.2)Type "help" for help.
macuser=#

您可以在env变量PGDATABASE=database_name中设置要连接的库名。如果您不设置此psql默认库名为用户名。设置后您不必创建

步骤1:

psql -d template1

现在你应该在psql终端上

步骤2:

CREATE DATABASE username;

确保在库名之后使用分号(;)

可选:在psql终端上键入\ls\l以列出所有数据库;

步骤3:

psql -h localhost

现在你应该连接;

在docker中运行postgres。在cli中,我收到错误“root”角色不存在。

su-postgres

psql

解决了问题。

PostgreSQL在安装PostgreSQL时创建的系统上有自己的用户。postgres用户无需密码即可登录PostgreSQL。没有其他用户能够登录PostgreSQL。

这意味着在使用PostgreSQL之前,您需要使用以下命令切换到该用户帐户:

su-postgres然后,您将能够使用命令登录PosgreSQL客户端:

psql您将无法像任何其他用户一样从命令行访问数据库。

这工作为我当解决这个问题

我运行sudo-i-u postgres-->以访问我的postgres数据库。

然后输入您的密码。

它将允许您现在输入psql这将提示您使用其他命令

干杯!