Creare un applicazione blog con django, parte 10: configurare Django con un database PostgreSQL

Attualmente stai utilizzando SQLite per il tuo progetto blog. Questo è sufficiente per scopi di sviluppo. Tuttavia, per un ambiente di produzione, avrai bisogno di un database più potente, ad esempio PostgreSQL, MySQL od Oracle. Modificheremo il nostro database per utilizzare PostgreSQL perché è molto più robusto e l'ORM (Object Relational Mapper) Django funziona molto meglio con esso.

Installare PostgreSQL

Se stai utilizzando Linux Ubuntu/Debian, installare pacchetti necessari per PostgreSQL di funzionare con Python come seguente:

$ sudo apt-get update
$ sudo apt-get install libpq-dev python3-dev

Poi installare PostgreSQL con il seguente comando:

$ sudo apt-get install postgresql postgresql-contrib

Su MacOS X, suggerisco di usare Homebrew, ti semplifica la vita. Non dimenticare di seguire le istruzioni Brew suggerisce dopo l'installazione. Installalo qui .

Apri l'app Terminale ed eseguire i seguenti comandi:

$ brew update
$ brew install postgresql

Su Windows scarica PostgreSQL da qui e installalo.

Inoltre è necessario installare l'adattatore Psycopg2 PostgreSQL per Python. Attivare il tuo ambiente virtuale Python ed eseguire il seguente comando per installarlo:

$ source venv/bin/activate
(venv)$ cd venv
(venv) ~/venv$ pip install psycopg2-binary==2.8.5

Creiamo un utente per il nostro database PostgreSQL. Apri il terminale ed eseguire i seguenti comandi:

$ sudo su - postgres     # Enter your root password here

Ora dovresti essere in una sessione shell per l'utente postgres. Esegui i seguenti comandi:

$ createuser -d dj_tutorial --superuser   # Enter your desired postgresql username here
$ createdb -O dj_tutorial blogdb         # Enter your desired database name here

Ora accedi a una sessione Postgres ed impostare la password. Esegui i seguenti comandi:

$ psql
postgres=# ALTER USER dj_tutorial WITH PASSWORD 'Enter-your-desired-password-here';

Ricorda di terminare tutti i comandi al prompt SQL con un punto e virgola ;.

Prima di continuare nella configurazione Django e PostgreSQL, parliamo di fixtures Django.

Bonus: Fixtures Django

Fixtures sono dati iniziali per il database. Il modo più semplice per creare un fixture se hai già dei dati è quello di utilizzare il comando dumpdata. Più avanti in questo tutorial chiameremo il comando loaddata per ripristinare i dati nel database.

Impostare fixtures Django

Apri il file settings.py del progetto ed aggiungere il codice seguente:

# mysite/settings.py

...

FIXTURE_DIRS = [
   os.path.join(BASE_DIR, "fixtures")
]

...

Creare una nuova cartella nella directory dell'applicazione blog e nominarla fixtures. Questo è dove Django trova i file fixture.

NB:

  • Quando si esegue il backup dell'intero database utilizzando il comando dumpdata, eseguirà il backup di tutte le tabelle del database
  • Se utilizzi questo backup del database per caricare il nuovo database, diciamo in un altro progetto Django, può causare IntegrityError ma se esegui il comando loaddata nello stesso database funziona correttamente
  • Per evitare questo problema, assicurarsi di eseguire il backup del database escludendo le tabelle contenttypes e auth.permissions

Ora esegui il seguente comando:

$ python manage.py dumpdata  --natural-foreign --format=json --exclude=auth.permission --exclude=contenttypes --indent=4 > blog/fixtures/blog.json

Il comando precedente eseguirà il backup del database in un file blog.json.

I formati di file possibili sono: JSON, XML o YAML (con PyYAML installato).

Apri il file json generato dal comando dumpdata, dovresti vedere qualcosa di simile:

[
{
   "model": "auth.user",
   "pk": 1,
   "fields": {
       "password": "pbkdf2_sha256$180000$hVC2VNBsBp7g$YZ0eAgNbllEtGXAfPpjrKKyyIJVE9OpieElG+fLQd8c=",
       "last_login": "2020-03-23T11:47:00.153Z",
       "is_superuser": true,
       "username": "admin",
       "first_name": "",
       "last_name": "",
       "email": "[email protected]",
       "is_staff": true,
       "is_active": true,
       "date_joined": "2020-01-05T00:25:50.532Z",
       "groups": [],
       "user_permissions": []
   }
},
{
   "model": "sessions.session",
   "pk": "cwnzmfy8yerypza0ar3wed1zyys7p4p1",
   "fields": {
       "session_data":   "OTQ0YzI0ZmYyMTI3ZjAwN2I0MjI1YTAyYTQzYWViM2IwN2U5YmFmNTp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJkOGI1ODE5MjQ1NDkwNDdlYTIyOTg3Mjg3NGNlNGExYTk1NTRmNzg4In0=",
       "expire_date": "2020-01-21T21:51:39.122Z"
   }
},
{
   "model": "sessions.session",
   "pk": "i767zn7ow1zdwazz42glfmss5dooeqg5",
   "fields": {
       "session_data": "OTQ0YzI0ZmYyMTI3ZjAwN2I0MjI1YTAyYTQzYWViM2IwN2U5YmFmNTp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJkOGI1ODE5MjQ1NDkwNDdlYTIyOTg3Mjg3NGNlNGExYTk1NTRmNzg4In0=",
       "expire_date": "2020-01-25T23:40:31.767Z"
   }
},
{
   "model": "sessions.session",
   "pk": "o7soi3vqo0sjr60vscad2zz8lb4wez79",
   "fields": {
       "session_data": "OTQ0YzI0ZmYyMTI3ZjAwN2I0MjI1YTAyYTQzYWViM2IwN2U5YmFmNTp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJkOGI1ODE5MjQ1NDkwNDdlYTIyOTg3Mjg3NGNlNGExYTk1NTRmNzg4In0=",
       "expire_date": "2020-04-06T11:47:00.162Z"
   }
},
{
   "model": "sessions.session",
   "pk": "ot6rcg11uji68y7xc1qraoxwi1k8ac11",
   "fields": {
       "session_data": "OTQ0YzI0ZmYyMTI3ZjAwN2I0MjI1YTAyYTQzYWViM2IwN2U5YmFmNTp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJkOGI1ODE5MjQ1NDkwNDdlYTIyOTg3Mjg3NGNlNGExYTk1NTRmNzg4In0=",
       "expire_date": "2020-01-19T00:26:43.369Z"
   }
},
{
   "model": "sessions.session",
   "pk": "top4gp1goqzfw3x32lbokj5pbzo82v1t",
   "fields": {
       "session_data": "OTQ0YzI0ZmYyMTI3ZjAwN2I0MjI1YTAyYTQzYWViM2IwN2U5YmFmNTp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJkOGI1ODE5MjQ1NDkwNDdlYTIyOTg3Mjg3NGNlNGExYTk1NTRmNzg4In0=",
       "expire_date": "2020-01-21T20:35:02.116Z"
   }
},
{
   "model": "sites.site",
   "pk": 1,
   "fields": {
       "domain": "localhost:8000",
       "name": "localhost:8000"
   }
},
{
   "model": "blog.post",
   "pk": 2,
   "fields": {
       "title": "the gods of our ancestors",
       "slug": "the-gods-of-our-ancestors",
       "author": [
           "admin"
       ],
       "body": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
       "publish": "2020-01-06T19:26:34Z",
       "created": "2020-01-06T19:27:16.261Z",
       "updated": "2020-01-11T23:40:52.422Z",
       "status": "published"
   }
},
{
   "model": "blog.post",
   "pk": 3,
   "fields": {
       "title": "django is the best python web framework",
       "slug": "django-best-python-web-framework",
       "author": [
           "admin"
       ],
       "body": "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).",
       "publish": "2020-01-11T23:45:03Z",
       "created": "2020-01-11T23:47:08.597Z",
       "updated": "2020-01-11T23:47:08.597Z",
       "status": "published"
   }
},
{
   "model": "blog.post",
   "pk": 4,
   "fields": {
       "title": "python is my favourite programming language",
       "slug": "python-my-favourite-programming-language",
       "author": [
           "admin"
       ],
       "body": "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).",
       "publish": "2020-01-11T23:48:08Z",
       "created": "2020-01-11T23:49:04.859Z",
       "updated": "2020-01-11T23:49:04.859Z",
       "status": "published"
   }
},
{
   "model": "admin.logentry",
   "pk": 1,
   "fields": {
       "action_time": "2020-01-06T19:22:41.135Z",
       "user": [
           "admin"
       ],
       "content_type": [
           "blog",
           "post"
       ],
       "object_id": "1",
       "object_repr": "the gods of our ancestor",
       "action_flag": 1,
       "change_message": "[{\"added\": {}}]"
   }
},
{
   "model": "admin.logentry",
   "pk": 2,
   "fields": {
       "action_time": "2020-01-06T19:26:01.347Z",
       "user": [
           "admin"
       ],
       "content_type": [
           "blog",
           "post"
       ],
       "object_id": "1",
       "object_repr": "the gods of our ancestors",
       "action_flag": 2,
       "change_message": "[{\"changed\": {\"fields\": [\"Title\"]}}]"
   }
},
{
   "model": "admin.logentry",
   "pk": 3,
   "fields": {
       "action_time": "2020-01-06T19:26:31.430Z",
       "user": [
           "admin"
       ],
       "content_type": [
           "blog",
           "post"
       ],
       "object_id": "1",
       "object_repr": "the gods of our ancestors",
       "action_flag": 3,
       "change_message": ""
   }
},
{
   "model": "admin.logentry",
   "pk": 4,
   "fields": {
       "action_time": "2020-01-06T19:27:16.262Z",
       "user": [
           "admin"
       ],
       "content_type": [
           "blog",
           "post"
       ],
       "object_id": "2",
       "object_repr": "the gods of our ancestors",
       "action_flag": 1,
       "change_message": "[{\"added\": {}}]"
   }
},
{
   "model": "admin.logentry",
   "pk": 5,
   "fields": {
       "action_time": "2020-01-11T23:40:52.432Z",
       "user": [
           "admin"
       ],
       "content_type": [
           "blog",
           "post"
       ],
       "object_id": "2",
       "object_repr": "the gods of our ancestors",
       "action_flag": 2,
       "change_message": "[{\"changed\": {\"fields\": [\"Status\"]}}]"
   }
},
{
   "model": "admin.logentry",
   "pk": 6,
   "fields": {
       "action_time": "2020-01-11T23:47:08.598Z",
       "user": [
           "admin"
       ],
       "content_type": [
           "blog",
           "post"
       ],
       "object_id": "3",
       "object_repr": "django is the best python web framework",
       "action_flag": 1,
       "change_message": "[{\"added\": {}}]"
   }
},
{
   "model": "admin.logentry",
   "pk": 7,
   "fields": {
       "action_time": "2020-01-11T23:49:04.868Z",
       "user": [
           "admin"
       ],
       "content_type": [
           "blog",
           "post"
       ],
       "object_id": "4",
       "object_repr": "python is my favourite programming language",
       "action_flag": 1,
       "change_message": "[{\"added\": {}}]"
   }
},
{
   "model": "admin.logentry",
   "pk": 8,
   "fields": {
       "action_time": "2020-03-08T16:39:04.495Z",
       "user": [
           "admin"
       ],
       "content_type": [
           "sites",
           "site"
       ],
       "object_id": "1",
       "object_repr": "localhost:8000",
       "action_flag": 2,
       "change_message": "[{\"changed\": {\"fields\": [\"Domain name\", \"Display name\"]}}]"
   }
}
]

Configurare Django con un database PostgreSQL

Modifica il file settings.py del progetto alla voce DATABASES ed aggiungi il codice seguente:

# mysite/settings.py

 DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'USER': 'dj_tutorial',
       'NAME': 'blogdb',
       'HOST': 'localhost',
       'PASSWORD': '**********',
       'PORT': '',
   },
}

Attenzione: Non divulgare mai informazioni sensibili, tenerle segrete.

Sostituire i dati precedenti con il nome del database e le credenziali per l'utente che hai creato. Il nuovo database è vuoto. Eseguire il seguente comando per applicare tutte le migrazioni del database:

$ python manage.py migrate

Infine possiamo chiamare il comando loaddata per ricaricare (ripristinare) i dati nel database. Esegui il seguente comando:

$ python manage.py loaddata blog

Ora esegui il server di sviluppo, apri http://localhost:8000/blog/ nel tuo browser noterai che i nostri posts sono rimasti gli stessi come mostrato nella seguente schermata:

Responsive image

per ora è tutto, rimani connesso per funzionalità più utili.


Se ti piace il mio contenuto, supportami! grazie.

Post correlati