Postgresql nie tworzy bazy danych z „createdb” jako superuser, ale nie wyświetla błędów [duplikat]

100

Pracuję ze świeżą instalacją postgresql, z superużytkownikiem „postgres”. Zalogowano przez:

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

Brak błędów, ale tabela nie jest tworzona. Jakieś pomysły?

Damien Roche
źródło
Ściśle związane ze stackoverflow.com/questions/8537576/ ...
Craig Ringer

Odpowiedzi:

209

createdbto narzędzie wiersza poleceń, które można uruchomić z basha, a nie z psql. Aby utworzyć bazę danych z psql , użyj poniższejcreate database instrukcji:

create database [databasename];

Uwaga: pamiętaj, aby zawsze kończyć instrukcje SQL znakiem ;

Saddam Abu Ghaida
źródło
35
Dzięki, teraz się uderzę. :)
Damien Roche
Pewnie. Łatwe punkty;) Trzeba jeszcze poczekać 7 minut (podobno). Dzięki jeszcze raz.
Damien Roche
35
nie zapomnij dodać średnika na końcu ..;
Timothy Dalton
4
ten pół-colin za zwycięstwo!
Michael Dimmitt
1
Dziękuję Ci! średnik wykonał pracę za mnie. tak malutkie, ale zmieniające życie;)
sas
75

Spóźniłem się na przyjęcie, ale zaakceptowana odpowiedź nie wyjaśnia, dlaczego nie jest wyświetlany żaden błąd. A ponieważ jest to coś, na co nowicjusze Postgres często napotykają, chciałem to dodać.


TL / TR: zawsze kończ swoje instrukcje SQL ciągiem ;


Ponieważ createdb databasenie kończy się na, ; psqluważa, że ​​instrukcja nie jest zakończona i czeka na dalsze dane wejściowe. Wskazuje na to monit zmieniający się z postgres=#na postgres-#. Niezwykle subtelna zmiana, którą psqlchciałbym zrobić inaczej (bardziej „widoczna”).

Wprowadzenie meta-polecenia \listpowoduje „przerwanie” „bieżącej” instrukcji SQL bez jej wykonywania.

Gdyby createdbzostało zakończone a, ;wynik wyglądałby tak:

postgres => createdb foobar;
BŁĄD: błąd składni na poziomie „createdb” lub w jego pobliżu
LINE 1: createdb foobar;
        ^
postgres =>

Wyraźnie pokazując, że coś jest nie tak.

koń bez imienia
źródło
3
Wow, to jest rzeczywiście subtelne, ale zabójcze. Miałem ten problem od dłuższego czasu. Za pierwszym razem, gdy uruchomisz polecenie ze średnikiem, pojawi się błąd, ponieważ createdbjest nieprawidłowy. Ale potem powtórzenie dokładnie tego samego polecenia z create databasezamiast createdbze średnikiem działa idealnie.
Glen Selle
1
@Helsing: tak właśnie napisałem, właśnie wyjaśniłem, dlaczego nie było komunikatu o błędzie, mimo że jest nieprawidłowy
a_horse_with_no_name
@a_horse_with_no_name Tak, źle zrozumiałem twój cel. Głosowałem również za twoją odpowiedzią.
Helsing
3

Niedawno byłem w takiej sytuacji. Na wypadek, gdyby ktoś inny tego doświadczył, biorąc pod uwagę, że postgres-#wiersz polecenia pokazuje, że można wykonać oczekujące polecenie createdb, po prostu wpisując ;i klawisz powrotu.

Fredrick Mgbeoma
źródło
1

Tworzenie nowej bazy danych w PostgreSQL jest bardzo proste, wykonaj to polecenie w systemie Linux (przykład z CentOS 7):

sudo -u postgres psql -c "create database MyDb;"
Avtandil Kavrelishvili
źródło
0

Korzystając z terminala węzłowego, musiałem uruchomić:

psql -U postgres 

[Wprowadź hasło]

następnie ...

CREATE DATABASE dbadmin;

Mylące jest to, że wprowadziłem te same polecenia wcześniej i nie zadziałało. Dopiero po wylogowaniu i ponownym zalogowaniu mogłem skorzystać z tego standardowego polecenia z dokumentacji: https://www.postgresql.org/docs/10/tutorial-createdb.html

EndePointe
źródło