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

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

6.10 Установка базы данных PostgreSQL
3 из 4 шагов пройдено
0 из 3 баллов  получено

Переключение базы данных в проекте

Отредактируйте файл settings.py проекта, видоизменив настроечный параметр DATABASES и придав ему следующий вид:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'blog',
        'USER': 'blog',
        'PASSWORD': 'xxxxxx',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

Замените xxxxxx паролем, который вы использовали при создании пользователя blog.

Новая база данных blog пуста. Выполните следующую ниже команду, чтобы применить все миграции к новой базе данных:

python manage.py migrate

Вы увидите результат, включая все миграции, которые были применены, как показано ниже:

Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions, sites, taggit
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying taggit.0001_initial... OK
  Applying taggit.0002_auto_20150616_2121... OK
  Applying taggit.0003_taggeditem_add_unique_index... OK
  Applying taggit.0004_alter_taggeditem_content_type_alter_taggeditem_tag... OK
  Applying taggit.0005_auto_20220424_2025... OK
  Applying blog.0001_initial... OK
  Applying blog.0002_remove_post_blog_post_publish_bb7600_idx_and_more... OK
  Applying blog.0003_comment... OK
  Applying blog.0004_post_tags... OK
  Applying sessions.0001_initial... OK
  Applying sites.0001_initial... OK
  Applying sites.0002_alter_domain_unique... OK

 

Загрузка данных в новую базу данных

Выполните следующую ниже команду, чтобы загрузить данные в базу данных PostgreSQL:

python -Xutf8 manage.py loaddata mysite_data.json

Вы увидите следующий ниже результат:

Число объектов может отличаться в зависимости от пользователей, постов, комментариев и других объектов, которые были созданы в базе данных ранее.

Следующей ниже командой запустите сервер разработки из командной оболочки:

python manage.py runserver

Пройдите по URL-адресу http://127.0.0.1:8000/admin/blog/post/ в своем браузере, чтобы убедиться, что все записи были загружены в новую базу данных. Вы должны увидеть все посты, как показано ниже:


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

django.db.utils.IntegrityError: Problem installing fixture

Пофиксил с помощью :

python manage.py shell

>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.all().delete()

А потом снова 

python manage.py loaddata mysite_data.json

@Попов_Станислав, Спасибо за подсказку!

Можно было бы не выгружать ContentType's в фикстуру, но они используются в тегах, и при загрузке из фикстуры без них теги "отъезжают". Предварительное их удаление перед загрузкой решает проблему.

Если у кого то на этапе

 python manage.py loaddata mysite_data.json

выпадает ошибка 

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 3869: invalid continuation byte

Мне помогло в файле mysite_data.json удалить все символы, которые отображались как �, но если поля после удаления этих символов остаются пустыми, стоит написать там что-то на английском

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

@Марат_Асылбаев, если вылетает ошибка, то нужно было делать экспорт как:

python -Xutf8 manage.py dumpdata --indent=2 --output=mysite_data.json

В лекции это было.

Так-же можно пересохранить файл дампа в кодировку utf-8 например блокнотом, только после этого необходимо удалить первые 3 байта BOM из него, например хекс редактором. Если редактировались блокнотом файлы шаблонов или файлы переводов(.po), то так-же следует удалять это байты.

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

Почему-то после смены ДБ на Postgres слетел пароль и логин с админки. И теперь не хочет пускать не под каким логином.

Изменен Кислинский Роман

@Кислинский_Роман, Проверяйте правильно ли вы загрузили данные в новую базу данных из json файла. Или попробуйте создать нового пользователя и бд и повторить все четко по инструкции.

@Илья_Перминов, Видимо, причина в этом. Это произошло после того, как удалил example.com из БД. Как починить?

@Кислинский_Роман, В админ панели, раздел SITES, добавьте сайт.

@Илья_Перминов, Стоит как в примере.


@Кислинский_Роман, И в settings.py не забудьте изменить SITE_ID на новое значение id сайта.

У вас значение SITE_ID скорее всего стало 2.

@Илья_Перминов, Разобрался, спасибо)

@Илья_Перминов, у меня тоже все слетело, пришлось заново создавать супер юзера

@Дмитрий_Чекмасов, странно, так быть не должно. Полностью вся БД должна была выгрузиться и загрузиться.

Была проблема с миграцией и загрузкой данных в PostgreSQL

Could not load contenttypes.ContentType(pk=7): duplicate key value violates unique constraint "django_content_type_app_label_model_76bd3d3b_uniq"
DETAIL:  Key (app_label, model)=(blog, post) already exists.

Решилось все созданием нового дампа такой командой:

python manage.py dumpdata --natural-foreign \
   --exclude=auth.permission --exclude=contenttypes \
   --indent=4 > data.json

С ним загрузка прошла хорошо, все работает

@Константин_Малыхин, пытались загрузить данные в новую и чистую базу PostgreSQL?

@Илья_Перминов, Да, я поднимал PostgreSQL в докере и была чистая Postgre 15.
Правда она сразу с пользователем поднималась, может дело в этом

Изменен Константин Малыхин

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

Если вы попробуете экспортировать данные на одном ПК, и восстановить на другом, то у вас ничего не выйдет. В процессе будет "выброшено" исключение IntegrityError. При этом на том же ПК, на котором был сделан экспорт - все будет импортироваться прекрасно. Чтобы избежать этой проблемы, из экспорта необходимо исключить таблицы contenttypes и auth.permissions:

./manage.py dumpdata --exclude auth.permission --exclude contenttypes > db.json

А докер это по сути другой ПК. 

@Константин_Малыхин, Не совсем "всё" - при таком способе выгрузки

Решилось все созданием нового дампа такой командой:

python manage.py dumpdata --natural-foreign \
   --exclude=auth.permission --exclude=contenttypes \
   --indent=4 > data.json

С ним загрузка прошла хорошо, все работает

неизбежно "отъедут" уже присвоенные постам теги. Этого можно избежать, удалив все объекты в ContentTypes

Добрый день! Появилась проблема с миграциями. Когда делал проект по вашему уроку все прошло хорошо. Сейчас делаю свой проект (с практически идентичным набором библиотек) и при выполнении команды migrate вылетает ошибка 'relation "django_migrations" already exists'. Даже, если я вручную через pgAdmin удаляю эту таблицу из БД, то при следующем выполнении команды "migrate" эта таблица создается заново и вылетает таже ошибка. Если я меняю обратно настройки на sqlite, то все выполняется идеально. Подскажите, пожалуйста в какую сторону смотреть, а то уже несколько дней воюю с этой проблемой и не получается победить. Ни интернет, ни (простихоспади) ChatGPT не дал пока рабочего варианта. И тот, и другой предлагали, в основном, сделать миграции с флагом --fake или --fake-initial, но не помогло. Хотя толком я не разобрался как это работает.

P.s. уже после этого комментария создал пустой новый проект, установил только окружение и в него "psycopg[binary]", и попробовал сделать миграции - та же самая ошибка.

Изменен Николай Попов

@Николай_Попов, вобще как-то странно что на чистом проекте вылазит ошибка, специально сейчас поставил чистый проект + чистая БД, команда migrate выполнилась без ошибок. Выполните pip freeze > requirements.txt и загрузите проект по ссылке https://mega.nz/filerequest/rANtUqzWHQ4, или хотя-бы файл один файл requirements.txt, если не хотите показывать проект.

@Дмитрий_Селезнев, да, поэтому я предполагаю, что, возможно, я наделал чего-то с postgres. Ведь с SQLite все замечательно работает и на пустом проекте, и на основном. Архив в проектом загрузил.

@Николай_Попов, у меня выполняются миграции без ошибок:

Сначала создал пользователя и бд для него:

postgres=# CREATE USER blog_user WITH PASSWORD 'xxxxxx';
CREATE ROLE
postgres=# CREATE DATABASE macro_site_db OWNER blog_user ENCODING 'UTF8';
CREATE DATABASE

Затем установил виртуальное окружение в проект, активировал его, установил зависимости из списка:

C:\Project\macro_site>python -m venv venv

C:\Project\macro_site>.\venv\Scripts\activate.bat

(venv) C:\Project\macro_site>pip install -r requirements.txt

Удалил три директории __pycache__, и все файлы, кроме __init__.py в директории migrations.

Прописал настройки новой бд.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'macro_site_db',
        'USER': 'blog_user',
        'PASSWORD': 'xxxxxx',
    }
}

Затем создал и применил миграции:

(venv) C:\Project\macro_site>python manage.py makemigrations
Migrations for 'macro_gallery':
  macro_gallery\migrations\0001_initial.py
    - Create model Photo

(venv) C:\Project\macro_site>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, macro_gallery, sessions, tagg
it, thumbnail
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying taggit.0001_initial... OK
  Applying taggit.0002_auto_20150616_2121... OK
  Applying taggit.0003_taggeditem_add_unique_index... OK
  Applying taggit.0004_alter_taggeditem_content_type_alter_taggeditem_tag... OK
  Applying taggit.0005_auto_20220424_2025... OK
  Applying taggit.0006_rename_taggeditem_content_type_object_id_taggit_tagg_cont
ent_8fc721_idx... OK
  Applying macro_gallery.0001_initial... OK
  Applying sessions.0001_initial... OK
  Applying thumbnail.0001_initial... OK

Сервер запускается без ошибок, при просмотре корневой директории сайта ValueError at /.

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

@Дмитрий_Селезнев, в общем у меня получилось сделать миграции, но только после того, как я полностью удалил Postgres и установил заново. Не знаю, что я там до этого накрутил и я ли это был, но вот так... Вам большое спасибо за быстрые ответы. Уже не в первый раз выручает ваша команда.

Добрый день, у меня возникла такая проблема

@Маркелов_Александр, а пользователя blog создали?

CREATE USER blog WITH PASSWORD 'xxxxxx';

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

@Маркелов_Александр, попробуйте добавить в файл settings.py, в настройки БД строки хост и порт:

        'HOST': '127.0.0.1',
        'PORT': '5433',

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

@Маркелов_Александр, попробуйте ещё раз удалить БД blog и заново её создать,  выполнить команду python manage.py migrate, а затем загрузить данные из json-файла python manage.py loaddata mysite_data.json.

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

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

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

@Маркелов_Александр, с файлом всё хорошо, успешно загрузился в чистую БД:

@Маркелов_Александр, выполните команду pip freeze > requirements.txt и загрузите архив проекта по той-же ссылке, посмотрю будет ли у меня работать.

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

@Маркелов_Александр, имелось ввиду загрузить архив проекта, вместе с этим файлом.

@Дмитрий_Селезнев, не сообразил как отправить проект в архиве, если можно скину ссылку на гитхаб (https://github.com/Mrklv001/Django-blog-v1.0)

@Маркелов_Александр, просто сжать директорию, и загрузить получившийся зип файл:

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

@Маркелов_Александр, Что делает этот код в admin.py?

user = User.objects.get(username='admin')
post = Post(title='Another post', slug='another-post', body='Post body.', author=user)
post.save()

Из-за этого у вас не могут выполниться миграции. Удаляете все миграции из папки migrations, оставив только _init_.py.

Убираете тот лишний код и далее выполняете следующие команды по очереди еще в проекте с SQLite:

python manage.py migrate blog zero
python manage.py makemigrations
python manage.py migrate

И потом снова выгружаете JSON дамп БД, меняете в настройках на PostgreSQL, делаете миграцию и заливаете дамп.

Изменен Илья Перминов

@Илья_Перминов, миграцию выполнить получилось, спасибо большое!!!
Только как понять ,что появилась новая бд, в проекте также осталось sqlite3

@Маркелов_Александр, теперь меняйте настройки на БД Постгри, выполняйте python manage.py migrate и загружайте дамп.

@Дмитрий_Селезнев, я так сделал, ничего не изменилось и удалились все посты

@Маркелов_Александр, попробуйте загрузить дамп из архива блога, у меня он работает:

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

@Маркелов_Александр, это не тот файл mysite_data.json, что был в архиве, из того выгружается 160 объектов.

(venv) C:\Project\blog v1.0>python manage.py loaddata mysite_data.json
Installed 160 object(s) from 1 fixture(s)

@Дмитрий_Селезнев, я делал новый mysite_data.json, так как сказали изменить файл admin.py, и удалил файлы из migration 

@Маркелов_Александр, загрузите старый прямо поверх нового. Если файла или проекта не осталось, могу скинуть.

@Дмитрий_Селезнев, наконец то получилось, спасибо вам огромное!!!!! 
Цены вам нет)

У меня все было хорошо, передал 56 объектов, потом не смог войти в админку, создал суперюзера, вошел и не увидел ни одного поста. Как быть?

@Maxim_Lapshin, загрузите json файл дампа, по ссылке https://mega.nz/filerequest/rANtUqzWHQ4, посмотрим в чём причина.

@Maxim_Lapshin, У вас почему то не полностью выгрузилась БД. В settings.py вернитесь на настройки БД SQLite, и попробуйте выгрузить снова дамп.

@Илья_Перминов, получилось! Спасибо большое) с 3 попытки. Я сначала использовал без кодировки версию python manage.py dumpdata --indent=2 --output=mysite_data.json Потом мне выдавало ошибку, я выполнял команду уже с кодировкой и поэтому данные на этом этапе терялись. С 3 попыткой сразу применил правильный dump и все прошло хорошо.

Добрый день! Делал все по инструкции, но пароль не принимает, хотя ввожу все, как в settings

@Руслан_Гаджиев, в файле settings.py находится пароль для БД, а не пароль админки, пароль админки останется прежним, каким он был создан ранее.

@Руслан_Гаджиев, администратора создавали в этим шаге https://stepik.org/lesson/972303/step/1?unit=979115, если забыли пароль, то можете его восстановить: в самом конце этого шага https://stepik.org/lesson/1146708/step/3?unit=1158606.

Или можете создать ещё одного администратора.

@Дмитрий_Селезнев, тогда странно, у меня сразу она слетела(старая админка), а тут мы что создаем?

@Руслан_Гаджиев, этой командой мы создаём пользователя blog БД PostgreSQL, далее мы создаём базу данных для него, с аналогичным именем blog, и в неё загружаем наши данные из БД SQLite, которые были предварительно выгружены в файл mysite_data.json.

То есть мы осуществляем перенос данных из одной базы (SQLite) данных в другую базу (PostgreSQL).

Пароль администратора должен тоже остаться прежним, он хранится в БД, и должен перенестись в новую.

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

у меня почему то не получается миграции сделать, пишет неверный пароль

@Ilia_Boiarintsev

@Ilia_Boiarintsev, а если попробовать подключится через psql с этими данными?

@Дмитрий_Селезнев, не понимаю, что я должен сделать?

@Ilia_Boiarintsev, попробовать подключится к БД blog в psql, используя имя пользователя blog и пароль admin.
Интересует будет подключение или нет.

@Дмитрий_Селезнев,   подключился

@Ilia_Boiarintsev, попробуйте добавить в файл settings.py, в настройки БД строки хост и порт:

        'HOST': '127.0.0.1',
        'PORT': '5432',

@Дмитрий_Селезнев, ура, все получилось! спасибо

Подскажите пожалуйста, как где можно перевести это в UTF-8?

Изменен Boogie Man

@Boogie_Man, посмотрите кодировку своей БД, выполните команду \l в psql, и сделайте скрин результата.

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

@Boogie_Man, а что показывает SHOW SERVER_ENCODING; ?

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

@Boogie_Man, можете прислать свой json дамп мне на почту - perminoff-ilya@yandex.ru

@Boogie_Man, проверьте почту, я исправил ваш файл.

В psql удалите базу, а затем заново её создайте:

DROP DATABASE blog;
CREATE DATABASE blog OWNER blog ENCODING 'UTF8';

затем загрузите исправленный файл

python manage.py migrate
python manage.py loaddata mysite_data_fixed.json
python manage.py runserver

@Boogie_Man, попробуйте удалить Django и установить его заново, выполните:

pip uninstall django
pip install django

 А после выполните команды из предыдущего сообщения.
Ваш проект у меня работает правильно с исправленным дампом, проверял на Django 4.2.4 и Django 4.2.3

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

Огромное спасибо за помощь!

Интересно, что я там накрутил

@Boogie_Man, в loaddata.py было на запятую меньше, чем в оригинальном, из Django 4.2.3.
Может и ещё что-то.