Postgresql не создает базу данных с «createdb» в качестве суперпользователя, но не выводит ошибки [дубликат]


100

Я работаю с новой установкой postgresql с суперпользователем postgres. Вы вошли через:

sudo -u postgres psql


postgres=# createdb database
postgres-# \list
                                  List of databases
   Name    |  Owner   | Encoding |  Collation  |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 template0 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
 template1 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres

Ошибок нет, но таблица не создается. Любые идеи?


Ответы:


209

createdbэто утилита командной строки, которую можно запускать из bash, а не из psql. Чтобы создать базу данных из psql , используйте такую create databaseинструкцию:

create database [databasename];

Примечание: всегда завершайте операторы SQL с помощью ;


35
Спасибо, я сейчас дам себе пощечину. :)
Дэмиен Рош

Конечно. Легкие очки;) Подождать еще 7 минут (видимо). Еще раз спасибо.
Дэмиен Рош

35
не забудьте добавить точку с запятой в конце ..;
Тимоти Далтон

4
этот полуколин для победы!
Майкл Диммитт

1
Спасибо! точка с запятой сделала всю работу за меня. такие крошечные, но меняющие жизнь;)
сас

75

Поздно к вечеринке, но принятый ответ не объясняет, почему не отображается ошибка. И поскольку новички в Postgres часто сталкиваются с этим, я хотел добавить это.


TL / TR: всегда заканчивайте свои операторы SQL с ;


Поскольку createdb databaseне заканчивается ; psqlсчитает заявление не закончен и ожидает ввод. Об этом свидетельствует изменение подсказки с postgres=#на postgres-#. Чрезвычайно тонкое изменение, которое я хотел psqlбы сделать по-другому (более «заметным»).

При вводе метакоманды \list«текущий» оператор SQL «прерывается» без его выполнения.

Если createdbбы был закончен ;на, вывод был бы следующим:

postgres => createdb foobar;
ОШИБКА: синтаксическая ошибка около "createdb"
СТРОКА 1: createdb foobar;
        ^
postgres =>

Ясно показывая, что что-то не так.


3
Вау, это действительно тонко, но смертельно опасно. У меня была эта проблема довольно долгое время. В первый раз, когда вы запустите команду с точкой с запятой, вы получите ошибку, потому что createdbона недействительна. Но затем повторение той же команды с точкой с запятой create databaseвместо точки createdbс запятой работает отлично.
Glen Selle

1
@Helsing: это то, что я написал, я просто объяснил, почему не было сообщения об ошибке, хотя оно недействительно
a_horse_with_no_name 07

@a_horse_with_no_name Да, я неправильно понял вашу цель. Проголосовал и за ваш ответ.
Helsing

3

Я был в этой ситуации не так давно. В случае, если кто-то другой испытает это, учитывая, что командная postgres-#строка показывает, что вы можете выполнить ожидающую команду createdb, просто набрав ;и клавишу возврата.



0

С помощью узлового терминала мне пришлось запустить:

psql -U postgres 

[введите ваш пароль]

затем ...

CREATE DATABASE dbadmin;

Что сбивает с толку, так это то, что я вводил эти же команды раньше, и это не сработало. Только после выхода и повторного входа я смог использовать эту стандартную команду из документации: https://www.postgresql.org/docs/10/tutorial-createdb.html

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.