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ó

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
django_mongo [2023/06/23 10:22]
david_lozano
django_mongo [2023/06/30 15:51] (actual)
raquel_alaman_navas
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 motors de cerca fins a la data d'avui (23/06/2023). És probable i desitjable que l'estat del tema tingui variacions a partir d'aquesta data.+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 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
  
-===== Exemple blog de codi desplegat ===== +Es a dirbàsicament, l'ORM de Django mapeja funcions a consultes SQL així és com llegimescrivim migrem la nostra base de dades.  
---> Proposta implementació Event# +Això no vol dir no que puguem treballar amb MongoDB. Tenim eines que ens permeten connectar-nos base de dades amb MongoDBLes veiem a continuació:
-Mostrem aquí un exemple de ''Event'' que compta amb el tipus d'eventel partitel jugador que el fa (després ens peremtrà comptar gols i fer la taula de "pichichis"),l'equip que l'ha realitzat. Això darrer podria resultar redundant (per tantqüestionable), però ho implementem així per simplicitat de recompte de gols i, sobretot, perquè un jugador pot canviar d'equip en un moment donat, però el gol ha de comptar per l'equip en el què jugava en aquell moment.+
  
-<file python models.py> +  * **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
-# models LligaEquipJugador, Partit...+  * **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 cercarsuprimiractualitzar i inserir.
  
-class Event(models.Model): +===== Djongo ===== 
-    # el tipus d'event l'implementem amb algo tipus "enum" +Djongo no fa cap canvi al marc existent de Django ORMla qual cosa significa que no apareixen errors innecessaris ni vulnerabilitats de seguretatSimplementtradueix una cadena de consulta SQL a un document de consulta MongoDBCom a resultattotes les funcions, models, etcde Django funcionen tal qual.
-    class EventType(models.TextChoices): +
-        GOL "GOL" +
-        AUTOGOL "AUTOGOL" +
-        FALTA "FALTA" +
-        PENALTY "PENALTY" +
-        MANS "MANS" +
-        CESSIO "CESSIO" +
-        FORA_DE_JOC "FORA_DE_JOC" +
-        ASSISTENCIA "ASSISTENCIA" +
-        TARGETA_GROGA "TARGETA_GROGA" +
-        TARGETA_VERMELLA "TARGETA_VERMELLA" +
-    partit = models.ForeignKey(Partit,on_delete=models.CASCADE) +
-    temps = models.TimeField() +
-    tipus = models.CharField(max_length=30,choices=EventType.choices) +
-    jugador = models.ForeignKey(Jugador,null=True, +
-                    on_delete=models.SET_NULL, +
-                    related_name="events_fets"+
-    equip = models.ForeignKey(Equip,null=True, +
-                    on_delete=models.SET_NULL) +
-    # per les faltes +
-    jugador2 = models.ForeignKey(Jugador,null=True,blank=True, +
-                    on_delete=models.SET_NULL, +
-                    related_name="events_rebuts"+
-    detalls = models.TextField(null=True,blank=True) +
-</file> +
-<--+
  
-\\+Si ja tens un projecte amb una base de dades SQL, instal·leu Djongo: 
 +  pip install djongo 
 +   
 +Ara, aneu a la carpeta del vostre projecte (per exemple, MyFirstDjangoProj ) i obriu el fitxer settings.py. Podeu editar-lo a Textpad, Python 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 (NOM) serà el nom de la vostra base de dades MongoDB. 
 +  DATABASES = { 
 +       'default':
 +           'ENGINE': 'djongo', 
 +           'NAME': 'db-name', 
 +       } 
 +   }
  
-===== Exemple Codi Online ===== +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. 
-Crearem un projecte Django i provarem si funciona simplement amb+  DATABASES { 
-  (env) $ django-admin startproject myproject +        'default'{ 
-  (env) $ cd myproject +            'ENGINE': 'djongo', 
-  (env) $ ./manage.py runserver+            'NAME': 'your-db-name', 
 +            'ENFORCE_SCHEMA': False, 
 +            'CLIENT':
 +                'host': 'mongodb+srv://<username>:<password>@<atlas cluster>/<myFirstDatabase>?retryWrites=true&w=majority' 
 +              
 +        } 
 +  }
  
-I per comprovar-ho accedeix amb el navegador a ''http://localhost:8000''.+Assegureu-vos que el nom de l'aplicació s'afegeix a la configuració INSTALLED_APPS del vostre settings.py: 
 +  INSTALLED_APPS = [ 
 +    'myfirstapp'
 +    'django.contrib.admin', 
 +    'django.contrib.auth', 
 +    'django.contrib.contenttypes', 
 +    'django.contrib.sessions', 
 +    'django.contrib.messages', 
 +    'django.contrib.staticfiles', 
 +  ]
  
-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]].+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
  
-\\+I podeu continuar fent servir el Django Admin.
  
-===== Exemple Wrap important ===== +Tot és fàcil meravellós però:
-Anem a Github (o a Gitlab, Bitbucket, etc.) fem [[Git#crear un nou repositori]]. Si ho feu a la web, ella mateix ens donarà la "xuleta" de com inicialitzar el nostre projecte i connectar-lo al repo remot.+
  
 <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.+**Djongo encara està en estat de proves**, és incomplet i només mapeja consultes bàsiques sense tenir en compte totes les funcionalitatsSi 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.
  
-En particular, prengueu cura de no fer cap ''git add .'' (afegeix tots els arxius) fins no tenir el ''.gitignore'' a l'arrel. 
 </WRAP> </WRAP>
  
-Teniu articles amb informació extensa sobre el [[VCS|sistema de control de versions]] de [[Git]] en particular.+Continua sent una eina molt potent 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.
  
-===== Exemple Wrap info ===== 
  
-<WRAP info> +===== Connecteu Django i MongoDB mitjançant PyMongo ===== 
-Podeu llegir referències sobre els potents formularis de Django a [[django_frontend#formularis|Django Formularis]].+ 
 +PyMongo és el controlador natural per connectar-nos de manera eficient 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> 
 +<-- 
 + 
 +\\ 
 + 
 +Treballant d'aquesta manera si podem aconseguir tota la potència de Mongo, a més podem disposar d'eines com MongoEngine. MongoEngine és una capa ORM a la part superior de PyMongo. L'ús de MongoEngine per connectar Django i MongoDB us ofereix camps com ListField i DictField per gestionar enormes dades JSON no estructurades. 
 + 
 +Ok, amb això no tindré problemes però: 
 + 
 +<WRAP important> 
 +**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. 
 + 
 +**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. 
 + 
 +**Adeu a les migracions i la validació dels models automàtica**,  
 </WRAP> </WRAP>
  
-===== Exemple Wrap todo =====+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?** 
 + 
 +===== Exercici proposat =====
 <WRAP todo> <WRAP todo>
-**Formularis**+Instal·lat el MongoDB al teu dispositiu i adapta l'exercici del tutorial de Django (Polls) amb la nova base de dades fent servir **Djongo**.  
 + 
 +Fes proves de totes les funcionalitats del tutorial: **Models, Admin, Migrations, Fakers**… 
  
-Elabora formularis per: +**Comenta si has tingut algun problema i com el podries resoldre.**
-  - Crear lliga. +
-    Assegura't que si ja hi ha una lliga amb el mateix nom, no ens deixi guardar. +
-    Pots fer-ho amb Form o amb ModelForm. +
-  - Crear equip. +
-  - Assignar equips a una lliga (afegir o treure).+
 </WRAP> </WRAP>
django_mongo.1687515748.txt.gz · Darrera modificació: 2023/06/23 10:22 per david_lozano