Django 5 для начинающих

Прогресс по курсу:  9/1004

9.3 Установка PostgreSQL, настройка и перенос БД
3 из 9 шагов пройдено
0 из 15 баллов  получено

Загрузка дампа в БД

 

Загрузим наш дамп в БД blog3 с помощью утилиты pg_restore, выполним:

sudo -u postgres pg_restore -d blog3 /var/www/mysite_03/blog.dump

Примечание: Имя БД blog3 необходимо заменить на то имя БД, которое использовалось на вашем локальном компьютере.


Теперь проверим результат загрузки дампа в БД, подключимся под пользователем blog3:

psql -h localhost -U blog3


Подключимся к БД нашего проекта - blog3, это необходимо только если у пользователя несколько БД и надо выбрать нужную:

Примечание: В данном примере приглашение blog3=> указывает на то, что БД blog3 уже подключена, выполнять команду \c blog3; нет смысла, она показана только для примера использования.

\c blog3;


И выведем листинг таблиц БД blog3:

\dt

Как мы видим появилась структура БД нашего проекта.


Завершаем просмотр - нажимаем клавишу Q, а затем выходим из psql, выполняем:

\q

БД нашего проекта была полностью перенесена на сервер.


Теперь перейдём в директорию /var/www/mysite_03/mysite и отредактируем файл настроек settings.py:


Отредактируем параметры подключения к БД, изменим пароль(если он менялся) и добавим строки HOST и PORT:

        'HOST': 'localhost',
        'PORT': '5432',


Сохраняем файл, и теперь можно перезапустить службу Gunicorn, выполняем:

systemctl restart gunicorn


Проверяем результат, снова откроем наш сайт в браузере: http://<имя вашего домена>:8001:

Сайт работает правильно, теперь можно перейти к установке NGINX.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Комментарий закреплён

Не получается выгрузить дамп в блог, выпадает ошибка:

Как можно исправить?

Изменен Марат Асылбаев

@Марат_Асылбаев, загрузите дамп по ссылке: https://mega.nz/filerequest/rANtUqzWHQ4, посмотрю.

@Дмитрий_Селезнев, готово, id=CFZXyK

@Марат_Асылбаев, дамп создан в версии 16rc1, вот и не загружается, посмотрю что можно сделать.

@Дмитрий_Селезнев, возможно ли выгрузить эту БД в json-файл как в тут и загрузить эти данные на сервере?

@Марат_Асылбаев, можно в текстовом(SQL) формате выгрузить:

pg_dump -U postgres -f C:\blog.sql blog

И загрузить:

sudo -u postgres psql blog < /var/www/mysite_03/blog.sql

Пользователь БД должен быть такой-же как и на локальном компьютере.

@Дмитрий_Селезнев, Принес решение: 

1. В командной строке Windows выполняем команды:

cd C:\Program Files\PostgreSQL\15\bin
pg_dump -U postgres -Fp -f D:/blog.dump blog

Тут ключевой параметр -Fp, так мы создаем SQL-скрипт в файле на основе БД.

2. Далее в той же командной строке отправляем файл на сервер:

cd C:\Program Files\PuTTY
pscp D:\blog.dump root@xxx.xxx.xxx.xxx:/var/www/mysite

3. Теперь заходим через PuTTY:

подключаемся к postgresql, вместо user пишем имя пользователя:

 psql -h localhost -U user 

подключаемся к своей ДБ:

\connect yourdatabase

Запускаем скрипт из файла:

\i /var/www/mysite/blog.dump

@Дмитрий_Селезнев, почти одновременно :D, только сейчас у меня internal server error :(

@Марат_Асылбаев, загрузите данные для доступа на сервер, на мегу, посмотрю в чём проблема.

@Дмитрий_Селезнев, готово r5NWbe

@Марат_Асылбаев, уже смотрю.

@Марат_Асылбаев, исправил, работает.

БД была нормально загружена, проблема в представлении post_search(), в Post.published.annotate( не закрыта скобка.

Пароль БД blog сменил, сменить обратно можно в psql (sudo -u postgres psql) так:

ALTER USER blog PASSWORD 'xxxxxxxx';

@Дмитрий_Селезнев, вы великолепны, спасибо

@Марат_Асылбаев, в случае такой ошибки (Internal Server Error) поступаем так.

Останавливаем Gunicorn, активируем виртуальное окружение и запускаем встроенный вебсервер Джанго:

python manage.py runserver 0.0.0.0:8001

Все ошибки будут в консоли, а адрес сайта будет такой-же http://ip:8001

@Дмитрий_Селезнев

Спасибо, получилось. В моем случаи вот такие команды тем кто работает в linux (может кому пригодится):

Создаем текстовый файл с БД ->    pg_dump -U blog -d blog -h localhost -p 5432 -Fp > blogdb.sql

Копируем и отправляем в директорию проекта на уд. сервер scp blogdb.sql root@xxx.xxx.xxx.xxx:/var/www/mysite_03

Загружаем БД в проект psql -h localhost -U blog -d blog < /var/www/mysite_03/blogdb.sql  (укажите свое имя -U и имя бд -d)

Подскажите, почему в settings.py секреты (тот же пароль к БД) остались незащищенными?

В разделе https://stepik.org/lesson/1005422/step/3?unit=1013061 мы установили python-dotenv, чтобы сохранять их в переменных среды. Было ощущение, что при деплое проекта они как-то будут добавлены в виде тех самых переменных, а в уроке об этом не упоминается, все сохранено в settings.py. Так и было задумано, или забыли?

@ilya_kutaev, пароль к БД Django никогда не покажет в сообщениях об ошибках(когда отладка включена). Хотя можно и добавить, хуже не будет. Такой способ чисто номинальная защита, если злоумышленник сможет выполнять команды python под пользователем www, то и прочитать этот файл не составит труда для него. Это скорее защита, чтобы секреты не попали в систему контроля версий - в git(необходимо добавить в файл .gitignore). Да и просто удобнее когда секреты хранятся в одном файле.

Доброго вечера,

Немного непонял такой момент:  при создании бд мы всегда делали миграции чтобы связи появились, а теперь на сервере мы просто загружаем <db_name>.dump и все работает ? или я где то упустил этот момент, надо делать python manage.py migrate ? У меня пока ошибка 

relation "blogapp_post" does not exist
LINE 1: SELECT COUNT(*) AS "__count" FROM "blogapp_post" WHERE "blog...  Я пытаюсь запустить сервер с пустой базой так как версии pg_restore оказались разные и я этого не учел, пока не разобрался как их согласовать только дошел до этого пункта.

@Владислав_Финогенов, при загрузке дампа миграции не нужны.

Вот решение для загрузки дампа, если версии БД не совпадают: https://stepik.org/lesson/1018273/step/4?discussion=8342006&reply=8342920&unit=1026204

@Владислав_Финогенов, миграции создают структуру в БД, то есть необходимые таблицы. Наш дамп же содержит все таблицы + содержимое таблиц.

Здравствуйте, столкнулся с ошибкой. Как я понимаю, проблема в формате, но не уверен, что стоит пересоздавать файл. В чем может быть дело?

@Никита_Совалин, похоже что дамп создавался без опции -Fc, лучше пересоздать и заново загрузить на сервер.
Или можно так загрузить существующий:

sudo -u postgres psql blog < /var/www/mysite/blog.dump

@Дмитрий_Селезнев, Пересоздал с -Fc, загрузил в среду, попытался выгрузить на сервер и вылетела другая ошибка:

@Никита_Совалин, посмотрите ниже комментарий, там решение точно такой-же проблемы. Если не получится загрузить таким способом, то обязательно напишите.

@Дмитрий_Селезнев, как раз таки после проведения всех операций из решения и попытки загрузки дампа, выдаёт изначальную ошибку. В решении ведь используется опция -Fp, а не -Fc.

@Никита_Совалин, да, всё верно, в решении ниже должна быть использована опция -Fp или её отсутствие, что эквивалентно.

Первый скрин показывает что была попытка загрузить текстовый дамп с помощью pg_restore(а нужно использовать в таком случае psql).
Второй скрин показывает что была попытка загрузить дамп в специальном формате(16й версии), что вызывает ошибку, так как на сервере установлена 15я версия БД.

Единственное решение в данном случае это создать дамп в текстовом формате:

pg_dump -U postgres -f C:\blog.sql blog

 А затем загрузить с помощью psql:

sudo -u postgres psql blog < /var/www/mysite/blog.sql

@Дмитрий_Селезнев, да, получилось, спасибо большое! Только у вас ошибка в синтаксисе: заменил < на > и получилось. Ещё раз спасибо

@Никита_Совалин, тут нет ошибки, посмотрите в официальной документации: https://www.postgresql.org/docs/15/backup-dump.html, раздел 26.1.1. Restoring the Dump.

programm < file: так мы передаём содержимое файла в программу, через stdin.

programm > file: так мы получаем вывод программы в файл, через stdout.

Изменен Дмитрий Селезнев