bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


django_mongo

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Següent revisió
Revisió prèvia
django_mongo [2023/06/23 08:47]
david_lozano creat
django_mongo [2024/06/17 16:57] (actual)
david_lozano [Django amb MongoDB]
Línia 1: Línia 1:
 ====== Django amb MongoDB ====== ====== Django amb MongoDB ======
  
-En aquest article provarem de veure quines opcions tenim per treballar amb Django i la BD basada en documents MongoDB. La informació està extreta de diversos tutorials articles i materials multimèdia trobats a les xarxes fins a la data d'avui (23/06/2023). És possible i desitjable que hi hagi millores en un futur.+En aquest article provarem de veure quines opcions tenim per treballar amb Django i la BD basada en documentsMongoDB. La informació està extreta de diversos tutorialsarticles i materials multimèdia trobats a motors de cerca fins a la data d'avui (23-06-2023). És probable i desitjable (com veureu) que hi hagi millores a partir d'aquesta data sobre aquest tema.
  
 Referències: Referències:
Línia 8: Línia 8:
   * PyMongo [[https://pymongo.readthedocs.io/en/stable/tutorial.html|tutorial PyMongo]].   * PyMongo [[https://pymongo.readthedocs.io/en/stable/tutorial.html|tutorial PyMongo]].
   * Article sobre [[https://medium.com/@dennisivy/read-this-before-using-mongodb-with-django-879927ce1ef|les funcionalitats de Djongo]].   * Article sobre [[https://medium.com/@dennisivy/read-this-before-using-mongodb-with-django-879927ce1ef|les funcionalitats de Djongo]].
 +  * [[Django i MongoDB CRUD]]
  
 {{tag> #FpInfor #Dam #DamMp06 #DamMp06Uf02 #DaMMp06Uf3 mongo mongodb django framework python web DevOps }} {{tag> #FpInfor #Dam #DamMp06 #DamMp06Uf02 #DaMMp06Uf3 mongo mongodb django framework python web DevOps }}
Línia 13: Línia 14:
 \\ \\
  
 +===== Suport de Django a bases de dades NoSQL? =====
 +Segons la documentació Django actualment dona suport oficial a les següents bases de dades:
 +  * PostgreSQL
 +  * MariaDB
 +  * MySQL
 +  * Oracle
 +  * SQLite
  
-===== Introducció per DevOps ===== +Es dir, bàsicament, l'ORM de Django mapeja funcions consultes SQL i així és com llegim, escrivim i migrem la nostra base de dades 
-Desenvolupar un projecte (en Django o en molts altres //frameworks//) és una tasca força diferent a la de construir la infraestructura correcta per a posar el projecte en producció, ja sigui directament en un servidor propi o de forma //dockeritzada// en contenidors. Això darrer és el què farem en aquest article, que és la feina més pròpia del DevOps.+Això no vol dir no que puguem treballar amb MongoDBTenim eines que ens permeten connectar-nos a base de dades amb MongoDB. Les veiem a continuació:
  
-Prepar un projecte Django per a què sigui segur implica diverses coses: +  * **Djongo** Ens permet treballar amb tot el potencial de Django amb MongoDB fent traduccions de les consultes SQL a la sintaxi de MongoDB permetent mantenir el potencial de l'ORM de Django i el seu sistema de models i migracions
-  - Configurar un virtualenv amb les llibreries adequades (requirements.txt). +  * **PyMongo** : PyMongo és el controlador estàndard mitjançant el qual MongoDB pot interactuar amb Django. És la forma oficial i preferida d'utilitzar MongoDB amb Python. PyMongo proporciona funcionalitat per dur a terme totes les accions de la base de dades com cercar, suprimir, actualitzar i inserir.
-  - Crear el projecte amb les versions adequades i actualitzades. +
-  - Tenir el projecte sota un [[VCS]] (sistema de versionat) com [[Git]]. +
-  - Configurar les dades sensibles del projecte (contrasenyes, tokens, etc.) perquè no es publiquin al repositori de codi. +
-  - Habilitar configuració de l'app mitjançant variables d'entorn, enlloc de fitxers. +
-  - Fer un README per facilitar la clonació posta en marxa del projecte. +
-  - Configurar la BD adequadament. +
-  - Configurar el servidor d'arxius estàtics+
-  - Posar el projecte en producció amb un servidor d'aplicacions (uWSGI) + un servidor web (Nginx) per als arxius estàtics.+
  
-\\+===== Djongo ===== 
 +Djongo no fa cap canvi al marc existent de Django ORM, la qual cosa significa que no apareixen errors innecessaris ni vulnerabilitats de seguretat. Simplement, tradueix una cadena de consulta SQL a un document de consulta MongoDB. Com a resultat, totes les funcions, models, etc. de Django funcionen tal qual.
  
-===== Entorn Python Venv ===== +Si ja tens un projecte amb una base de dades SQLinstal·leu Djongo: 
-Per treballar en Python ens convé una eina d'entorn que ens aïlli les diferents versions de llibreries que farem serviri no tenir incompatibilitats entre les diferents aplicacions que puc tenir (ni tampoc amb el sistema operatiuque té les seves pròpies versions de les llibreries).+  pip install djongo 
 +   
 +Ara, aneu a la carpeta del vostre projecte (per exemple, MyFirstDjangoProj ) i obriu el fitxer settings.py. Podeu editar-lo a TextpadPython IDE o qualsevol editor. Cerqueu BASES DE DADES i canvieu la configuració perquè apunti a MongoDB. El MOTOR serà djongo i el nom de la base de dades (NOMserà el nom de la vostra base de dades MongoDB. 
 +  DATABASES = { 
 +       'default':
 +           'ENGINE': 'djongo', 
 +           'NAME': 'db-name', 
 +       } 
 +   }
  
-A l'article [[Python venv]] teniu detalls a fons de com utilitzar aquestes eines.+Si la vostra base de dades no es troba a localhost o està protegida, també hauríeu d'omplir la informació del CLIENT com HOST, USERNAME, PASSWORD, etc. 
 +  DATABASES = { 
 +        'default':
 +            'ENGINE': 'djongo', 
 +            'NAME': 'your-db-name', 
 +            'ENFORCE_SCHEMA': False, 
 +            'CLIENT':
 +                'host': 'mongodb+srv://<username>:<password>@<atlas cluster>/<myFirstDatabase>?retryWrites=true&w=majority' 
 +            }   
 +        } 
 +  }
  
-Resumidament, necessitem crear l'entorn virtual, entrar-hi i instal·lar Django+Assegureu-vos que el nom de l'aplicació s'afegeix a la configuració INSTALLED_APPS del vostre settings.py
-  $ python3 -m venv env +  INSTALLED_APPS = [ 
-  $ source env/bin/activate +    'myfirstapp', 
-  (env) $ pip install django+    'django.contrib.admin', 
 +    'django.contrib.auth', 
 +    'django.contrib.contenttypes', 
 +    'django.contrib.sessions', 
 +    'django.contrib.messages', 
 +    'django.contrib.staticfiles', 
 +  ]
  
 +Ara que tenim el projecte (i l'aplicació) Django, podeu crear les col·leccions a MongoDB mitjançant les ordres:
 +  python manage.py makemigrations <app-name>
 +  python manage.py migrate
  
-===== Crear projecte ===== +I podeu continuar fent servir el Django Admin.
-Crearem un projecte Django i provarem si funciona simplement amb: +
-  (env) $ django-admin startproject myproject +
-  (env) $ cd myproject +
-  (env) $ ./manage.py runserver+
  
-I per comprovar-ho accedeix amb el navegador a ''http://localhost:8000''.+Tot és fàcil i meravellós però:
  
-Si volem endinsar-nos a la programació amb Django es recomana seguir l'excel·lent [[https://docs.djangoproject.com/en/stable/intro/tutorial01/|tutorial oficial Django]].+<WRAP important> 
 +**Djongo encara està en estat de proves**, és incomplet i només mapeja consultes bàsiques sense tenir en compte totes les funcionalitats. Si requeriu alguna cosa més complexa, us haureu d'espavilar vosaltres com a desenvolupadors. 
 + 
 +**Djongo actualment té molt poc suport** a incidències que s'estan generant i ara per ara no és compatible a versions del Django superiors a la 3.0.5. 
 + 
 +**Djongo converteix les consultes SQL en consultes MongoDB**, cosa que realment no té sentit en una base de dades de documents. No obtindreu cap dels avantatges de MongoDB. I en realitat podria provocar un rendiment baix a MongoDB vs SQL. 
 + 
 +</WRAP> 
 + 
 +Continua sent una eina molt potent i per desenvolupaments petits o pràctiques d'aula crec que me'l quedo. Però aneu molt amb compte per desenvolupaments més grans o amb moltes dades. 
 + 
 + 
 +===== Connecteu Django i MongoDB mitjançant PyMongo ===== 
 + 
 +PyMongo és el controlador natural per connectar-nos de manera eficient a una base de dades MongoDB. Com que PyMongo està disponible amb PyPI, podeu instal·lar-lo ràpidament mitjançant una comanda pip: 
 +  pip install pymongo[snappy,gssapi,srv,tls] 
 + 
 +A continuació teniu un exemple de codi per a la connexió i les funcionalitats CRUD bàsiques: 
 + 
 +--> Tutorial ràpid CRUD amb PyMongo# 
 +En aquest tutorial ràpid, demostrarem com utilitzar PyMongo per fer operacions CRUD senzilles. Per a això, creem una sessió de PyMongo: 
 + 
 +<file python exemple.py> 
 + 
 +import pymongo 
 +#connect_string = 'mongodb+srv://<username>:<password>@<atlas cluster>/<myFirstDatabase>?retryWrites=true&w=majority'  
 + 
 +from django.conf import settings 
 +my_client = pymongo.MongoClient(connect_string) 
 + 
 +# First define the database name 
 +dbname = my_client['sample_medicines'
 + 
 +# Now get/create collection name (remember that you will see the database in your mongodb cluster only after you create a collection 
 +collection_name = dbname["medicinedetails"] 
 + 
 +#let's create two documents 
 +medicine_1 = { 
 +    "medicine_id": "RR000123456", 
 +    "common_name" : "Paracetamol", 
 +    "scientific_name" : "", 
 +    "available" : "Y", 
 +    "category": "fever" 
 +
 +medicine_2 = { 
 +    "medicine_id": "RR000342522", 
 +    "common_name" : "Metformin", 
 +    "scientific_name" : "", 
 +    "available" : "Y", 
 +    "category" : "type 2 diabetes" 
 +
 +# Insert the documents 
 +collection_name.insert_many([medicine_1,medicine_2]
 +# Check the count 
 +count = collection_name.count() 
 +print(count) 
 + 
 +# Read the documents 
 +med_details = collection_name.find({}) 
 +# Print on the terminal 
 +for r in med_details: 
 +    print(r["common_name"]) 
 +# Update one document 
 +update_data = collection_name.update_one({'medicine_id':'RR000123456'}, {'$set':{'common_name':'Paracetamol 500'}}) 
 + 
 +# Delete one document 
 +delete_data = collection_name.delete_one({'medicine_id':'RR000123456'}) 
 +</file> 
 +<--
  
 \\ \\
  
-===== Crear repositori Git ===== +Treballant d'aquesta manera si podem aconseguir tota la potència de Mongoa més podem disposar d'eines com MongoEngineMongoEngine és una capa ORM a la part superior de PyMongo. L'ús de MongoEngine per connectar Django i MongoDB us ofereix camps com ListField DictField per gestionar enormes dades JSON no estructurades. 
-Anem a Github (o a Gitlab, Bitbucketetc.) i fem [[Git#crear un nou repositori]]. Si ho feu a la web, ella mateix ens donarà la "xuleta" de com inicialitzar el nostre projecte connectar-lo al repo remot.+ 
 +Ok, amb això no tindré problemes però:
  
 <WRAP important> <WRAP important>
-No pugeu res al repositori remot fins que hagueu configurat correctament el projecte amb el ''.gitignore'' com es descriu més avall.+**Adeu a l'ORM de Django**, haureu de fer les vostres consultes des de zero, així que oblideu-vos de tot el que sabeu sobre la "manera Django" predeterminada.
  
-En particular, prengueu cura de no fer cap ''git add .'' (afegeix tots els arxius) fins no tenir el ''.gitignore'' a l'arrel. +**Adeu a aquest Admin tan xulo** treballa fent crides a l'ORM, per tant, veig difícil poder-ho adaptar fàcilment ara per ara.
-</WRAP>+
  
-Teniu articles amb informació extensa sobre el [[VCS|sistema de control de versions]] de [[Git]] en particular.+**Adeu a les migracions la validació dels models automàtica**, 
  
 +</WRAP>
  
-==== Configurar .gitignore ==== +Tot i en aquestes condicions encara Django és un framework bo per treballar, però no prou per plantejar-te si és la millor opció disponible per treballar amb MongoDB**Quina proposes tu?**
-Abans d'entrar tots els arxius ens convé crear un arxiu ''.gitignore'' a l'arrel del nostre repositori (si esteu seguint el tutorial Django oficial, seria la carpeta ''mysite''). Aquest li dirà a la instrucció ''git add'' que ignori els arxius que compleixi amb determinats patrons.+
  
-En particular, NO volem que entrin al repo: +===== Exercici proposat ===== 
-  * Arxius que continguin contrasenyes altra informació sensible que no volem que es publiqui. +<WRAP todo> 
-  * El fitxer de la BD de SQLite (db.sqlite) +Instal·lat el MongoDB al teu dispositiu adapta l'exercici del tutorial de Django (Pollsamb la nova base de dades fent servir **Djongo**. 
-  * Els arxius transitoris d'execució accelerada de Python (els arxius .pyc) +
-  Les carpetes de [[virtualenv]]. El ''virtualenv'' es crearà de nou cada cop que clonem un repositori.+
  
-Una versió mínima dels arxius i carpetes que NO volem que es puguin al repo seria aquest:+Fes proves de totes les funcionalitats del tutorial**Models, Admin, Migrations, Fakers**… 
  
-<file .gitignore .gitignore> +**Comenta si has tingut algun problema i com el podries resoldre.** 
-*.pyc +</WRAP>
-/env/ +
-/venv/ +
-/static/* +
-/media/* +
-.env +
-db.sqlite3 +
-.coverage +
-__pycache__ +
-</file>+
django_mongo.1687510033.txt.gz · Darrera modificació: 2023/06/23 08:47 per david_lozano