perminovma
@perminovma

Как узнать в ту ли базу PostgreSQL я подключаюсь?

Всем доброго дня !

Для Django (веб-вреймвок на Python) проекта решил использовать новую для себя БД PostgreSQL.

Создал БД и сделал ее владельцем только что созданного пользователя dbuser, которому задал пароль.

В настройки Django проекта прописал (тут вроде все верно):
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'ew',
        'USER': 'dbuser',
        'PASSWORD': '...',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}


После чего запустил migrate (по этой команде Django соединяется с БД и заливает в нее изменения).

И все прошло успешно. Я могу зайти зайти в интерфейс администратора автоматически созданный Django в котором видно, что сам Django смог подключиться к БД, создать в ней нужные таблицы и записи в ней.

Но после того, как я захотел зайти в эту БД через консольку psql и увидеть данные в ней мне выдавалась ошибка аутентификации.

После чего, я нашел файл hba_file:
postgres=# SHOW hba_file;
               hba_file               
--------------------------------------
 /etc/postgresql/9.3/main/pg_hba.conf
(1 row)


И поменял в нем строчку local all postgres peer на local all postgres md5, перезапустил postgesql и вроде смог зайти:
postgres@eworld:/home/WMUser/ew$ psql -U dbuser -d ew
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_PAPER = "ru_RU.UTF-8",
	LC_ADDRESS = "ru_RU.UTF-8",
	LC_MONETARY = "ru_RU.UTF-8",
	LC_NUMERIC = "ru_RU.UTF-8",
	LC_TELEPHONE = "ru_RU.UTF-8",
	LC_IDENTIFICATION = "ru_RU.UTF-8",
	LC_MEASUREMENT = "ru_RU.UTF-8",
	LC_TIME = "ru_RU.UTF-8",
	LC_NAME = "ru_RU.UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Password for user dbuser: 
psql (9.3.8)
Type "help" for help.

ew=>


Но зайдя в БД: \c ew
И решив увидеть все таблицы которые создал Django я увидел:
ew=> \dt
No relations found.


Ничего не понимаю, вроде бы данные где-то есть, но либо я этим пользователем их просто не вижу, либо они находятся где-то в другом месте.

В Django есть такая комманда: dbshell, через нее можно войти в БД которую я прописал в Django конфиге. И вот в чем магия: когда я зашел в postgresql консоль через нее, то смог увидеть все таблички:
WMUser@eworld:~/ew/eworld$ python manage.py dbshell
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_PAPER = "ru_RU.UTF-8",
	LC_ADDRESS = "ru_RU.UTF-8",
	LC_MONETARY = "ru_RU.UTF-8",
	LC_NUMERIC = "ru_RU.UTF-8",
	LC_TELEPHONE = "ru_RU.UTF-8",
	LC_IDENTIFICATION = "ru_RU.UTF-8",
	LC_MEASUREMENT = "ru_RU.UTF-8",
	LC_TIME = "ru_RU.UTF-8",
	LC_NAME = "ru_RU.UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
psql (9.3.8, server 9.3.3)
Type "help" for help.

ew=> \dt
                  List of relations
 Schema |            Name            | Type  | Owner  
--------+----------------------------+-------+--------
 public | auth_group                 | table | dbuser
 public | auth_group_permissions     | table | dbuser
 public | auth_permission            | table | dbuser
 public | auth_user                  | table | dbuser
 public | auth_user_groups           | table | dbuser
 public | auth_user_user_permissions | table | dbuser
 public | django_admin_log           | table | dbuser
 public | django_content_type        | table | dbuser
 public | django_migrations          | table | dbuser
 public | django_session             | table | dbuser
(10 rows)

ew=>


Есть еще одна интересная особенность (может поможет мне помочь) если я делаю \l из django консоли, то мне выводит:
List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 ew        | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres         +
           |          |          |             |             | postgres=CTc/postgres+
           |          |          |             |             | dbuser=CTc/postgres


А если из psql:
List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 ew        | dbuser   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |


Т.е. в одном случае у БД ew один владелец, в другом случае другой. Как так? Складывается такое ощущение, как будто бы это вообще 2 совсем разные базы...

Прошу помощи в том, чтобы разобраться, что происходит.

Заранее спасибо за ответ!
  • Вопрос задан
  • 2382 просмотра
Решения вопроса 1
@marazmiki
Укротитель питонов
Скорее всего, джанго подключается через tcp-сокет, а psql — локально; попробуйте указать хост для соединения:
psql -U dbuwer -H 127.0.0.1 ew
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@denizen
После \c ew попробуйте \dn - получите список схем базы, потом попробуйте \dt имясхемы.*
Или как вариант - set search_path=имясхемы;. Если схем несколько, то пишите их через запятую.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы