Πώς να χρησιμοποιήσετε το Django με το MongoDB προσθέτοντας μόνο μία γραμμή κώδικα.

Πώς να χρησιμοποιήσετε το Django με το MongoDB προσθέτοντας μόνο μία γραμμή κώδικα.

Για να χρησιμοποιήσετε το MongoDB ως βάση δεδομένων backend στο έργο Django, απλώς προσθέστε αυτήν τη μία γραμμή στο αρχείο settings.py:

DATABASES = { ‘default’: { ‘ENGINE’: ‘djongo’, ‘NAME’: ‘your-db-name’, }}

Είναι τόσο απλό!

Στη συνέχεια, συνδεθείτε στο σπίτι διαχειριστή σας (localhost: 8000 / admin /) και ξεκινήστε να προσθέτετε "ενσωματωμένα έγγραφα" στο MongoDB χρησιμοποιώντας το διαχειριστή GUI:

Τον Οκτώβριο του 2017, η MongoDB ολοκλήρωσε το τελευταίο βήμα για να δημοσιοποιηθεί, τιμολογώντας την IPO της στα 24 $ και αυξάνοντας 192 εκατομμύρια δολάρια στη διαδικασία. Τα οικονομικά της εταιρείας αυξάνονται σταθερά:

Το MongoDB παρέχει λογισμικό βάσης δεδομένων ανοιχτού κώδικα. Αυτό είναι πολύ χρήσιμο για νεοσύστατες επιχειρήσεις που θέλουν να ξεκινήσουν, ενώ περιορίζονται από περιορισμένους προϋπολογισμούς. Μια ανασκόπηση των τάσεων αναζήτησης Google για το MongoDB αποκάλυψε μια σταθερή αύξηση του ενδιαφέροντος.

Το MongoDB γίνεται όλο και περισσότερο ένα δημοφιλές λογισμικό βάσης δεδομένων για να εργαστεί. Βάσεις δεδομένων και συστήματα διαχείρισης βάσεων δεδομένων (DBMS) υπάρχουν για περισσότερο από πέντε δεκαετίες. Αναδύθηκαν στις αρχές της δεκαετίας του 1960, και η πιο δημοφιλής γεύση ήταν το σχεσιακό σύστημα βάσεων δεδομένων.

Ωστόσο, η MongoDB αποκαλείται «μη σχεσιακό» σύστημα βάσης δεδομένων και έχει ισχυρισμούς σχετικά με την προσέγγισή της στην αποθήκευση δεδομένων. Λοιπόν, τι ακριβώς είναι η ΜΕΓΑΛΗ προσφορά εδώ;

MongoDB εναντίον SQL

Σχεδόν όλα τα συστήματα σχεσιακών βάσεων δεδομένων χρησιμοποιούν τη Δομημένη Γλώσσα Ερωτήσεων (SQL) (ή μια τροποποιημένη έκδοση αυτής) για να επικοινωνούν με το λογισμικό διαχείρισης δεδομένων. Αρκετά πανεπιστημιακά μαθήματα είναι αποκλειστικά αφιερωμένα στην κατανόηση και την κυριότητα της σύνταξης SQL.

Η SQL είχε γίνει η de-facto γλώσσα για εργασία με οποιοδήποτε λογισμικό βάσης δεδομένων (DB), ιδιόκτητο ή ανοιχτό κώδικα. Στη συνέχεια, η MongoDB ήρθε και αποφάσισε να δείξει απόλυτη αδιαφορία σε αυτήν την αρχαία γλώσσα της εξουσίας και εισήγαγε τη δική της σύνταξη ερωτημάτων.

Η γλώσσα είναι αυτή του Mordor, την οποία δεν θα πω εδώ. Στην κοινή γλώσσα, λέει, «Ένα δαχτυλίδι για να τα κυβερνά όλα. Ένα δαχτυλίδι για να τα βρείτε. Ένα δαχτυλίδι για να τα φέρει όλα και στο σκοτάδι τους συνδέει. "- Gandalf ( από τον άρχοντα των δαχτυλιδιών )

MongoDB Schemaless vs SQL Schema: Σε μια βάση δεδομένων SQL, είναι αδύνατο να προσθέσετε δεδομένα έως ότου ορίσετε πίνακες και τύπους πεδίων σε αυτό που αναφέρεται ως σχήμα. Σε μια βάση δεδομένων MongoDB, τα δεδομένα μπορούν να προστεθούν οπουδήποτε, ανά πάσα στιγμή. Δεν χρειάζεται να καθορίσετε μια σχεδίαση εγγράφων ή ακόμα και μια συλλογή εκ των προτέρων.

MongoDB Documents vs SQL Tables: Οι βάσεις δεδομένων SQL παρέχουν ένα κατάστημα σχετικών πινάκων δεδομένων. Κάθε σειρά είναι διαφορετική εγγραφή. Ο σχεδιασμός είναι άκαμπτος: δεν μπορείτε να χρησιμοποιήσετε τον ίδιο πίνακα για να αποθηκεύσετε διαφορετικές πληροφορίες ή να εισαγάγετε μια συμβολοσειρά όπου αναμένεται ένας αριθμός.

Η βάση δεδομένων MongoDB αποθηκεύει έγγραφα ζεύγους πεδίου τύπου JSON. Παρόμοια έγγραφα μπορούν να αποθηκευτούν σε μια συλλογή, η οποία είναι ανάλογη με έναν πίνακα SQL. Ωστόσο, μπορείτε να αποθηκεύσετε δεδομένα που θέλετε σε οποιοδήποτε έγγραφο - το MongoDB δεν θα παραπονεθεί. Οι πίνακες SQL δημιουργούν ένα αυστηρό πρότυπο δεδομένων, επομένως είναι δύσκολο να κάνετε λάθη. Το MongoDB είναι πιο ευέλικτο και συγχωρετικό, αλλά η δυνατότητα αποθήκευσης οποιωνδήποτε δεδομένων οπουδήποτε μπορεί να οδηγήσει σε προβλήματα συνέπειας.

Υπάρχει μια πληθώρα διαδικτυακού περιεχομένου που υποστηρίζει ότι το MongoDB δεν είναι ένα υπερσύνολο της SQL. Οι εφαρμογές που εκτελούνται σε SQL δεν μπορούν να μεταφερθούν στο MongoDB. Βρίσκομαι εδώ για να ισχυριστώ ότι, στο πλαίσιο του Django, το MongoDB είναι ένα υπερσύνολο της SQL .

Γιατί, λοιπόν, υπάρχει η πρώτη πεποίθηση, ότι το MongoDB δεν είναι υπερσύνολο της SQL;

Το MongoDB απαιτεί Denormalization των δεδομένων: Στο MongoDb δεν υπάρχει υποστήριξη JOIN. Αυτό σημαίνει ότι θα πρέπει να αποδιαμορφώσουμε τα έγγραφά μας. Τα αποδιαμορφωμένα έγγραφα οδηγούν σε γρηγορότερα ερωτήματα, αλλά η ενημέρωση των πληροφοριών πεδίου εγγράφων σε πολλά αποδιαμορφωμένα έγγραφα θα είναι σημαντικά πιο αργή.

Δεν υπάρχουν ΣΥΝΔΕΣΕΙΣ : Τα ερωτήματα SQL προσφέρουν μια ισχυρή ρήτρα JOIN Μπορούμε να λάβουμε σχετικά δεδομένα σε πολλούς πίνακες χρησιμοποιώντας μία μόνο δήλωση SQL. Σε μη σχεσιακές βάσεις δεδομένων όπως το MongoDB, δεν υπάρχουν ΚΟΙΝΟΙ όπως θα υπήρχαν σε σχεσιακές βάσεις δεδομένων. Αυτό σημαίνει ότι πρέπει να εκτελέσετε πολλά ερωτήματα και να ενώσετε τα δεδομένα με μη αυτόματο τρόπο στον κώδικά σας.

Χωρίς συναλλαγές: Σε βάσεις δεδομένων SQL, δύο ή περισσότερες ενημερώσεις μπορούν να εκτελεστούν σε μια συναλλαγή - ένα περιτύλιγμα όλα ή τίποτα που εγγυάται επιτυχία ή αποτυχία. Εάν εκτελέσουμε δύο ενημερώσεις ξεχωριστά, η μία θα μπορούσε να πετύχει και η άλλη να αποτύχει - αφήνοντας έτσι τα στοιχεία μας εκτός συγχρονισμού. Η τοποθέτηση των ίδιων ενημερώσεων σε μια συναλλαγή διασφαλίζει ότι είτε και τα δύο επιτυγχάνουν είτε και τα δύο αποτυγχάνουν.

Χωρίς περιορισμούς ξένου κλειδιού: Οι περισσότερες βάσεις δεδομένων SQL σάς επιτρέπουν να επιβάλλετε κανόνες ακεραιότητας δεδομένων χρησιμοποιώντας περιορισμούς ξένου κλειδιού. Αυτό διασφαλίζει ότι όλες οι σειρές έχουν ένα έγκυρο ξένο κλειδί για κωδικό που ταιριάζει με μια καταχώριση στον πίνακα σύνδεσης και διασφαλίζει ότι δεν θα καταργηθεί μια εγγραφή από τον πίνακα σύνδεσης εάν μία ή περισσότερες σειρές εξακολουθούν να αναφέρονται σε αυτές.

Το σχήμα επιβάλλει αυτούς τους κανόνες για να ακολουθήσει η βάση δεδομένων. Είναι αδύνατο για προγραμματιστές ή χρήστες να προσθέσουν, να επεξεργαστούν ή να αφαιρέσουν εγγραφές, κάτι που θα μπορούσε να οδηγήσει σε μη έγκυρα δεδομένα ή ορφανές εγγραφές. Οι ίδιες επιλογές ακεραιότητας δεδομένων δεν είναι διαθέσιμες στο MongoDB. Μπορείτε να αποθηκεύσετε ό, τι θέλετε ανεξάρτητα από άλλα έγγραφα. Στην ιδανική περίπτωση, ένα μόνο έγγραφο θα ήταν η μόνη πηγή όλων των πληροφοριών σχετικά με ένα αντικείμενο.

Η ανάγκη για ένα μοντέλο βάσης δεδομένων

Τα αντικείμενα είναι η αφαίρεση δεδομένων του Python. Όλα τα δεδομένα σε ένα πρόγραμμα Python αντιπροσωπεύονται από αντικείμενα ή από σχέσεις μεταξύ αντικειμένων. Ενώ τα αντικείμενα είναι ένας καλός τρόπος για την αναπαράσταση δεδομένων, ένα πρόβλημα προκύπτει όταν θέλουμε να κάνουμε τα δεδομένα επίμονα. Ο όγκος των δεδομένων θα μπορούσε να είναι τεράστιος και πρέπει να ανακτηθεί από την επίμονη μνήμη γρήγορα και αποτελεσματικά. Αυτό το λογισμικό βάσης δεδομένων πρέπει να χρησιμοποιηθεί για την αποθήκευση των αντικειμένων. Ένα πιθανό λογισμικό βάσης δεδομένων είναι ένα σχεσιακό λογισμικό βάσης δεδομένων βασισμένο σε SQL.

Ένας χάρτης αντιστοίχισης αντικειμένων (ORM) είναι μια βιβλιοθήκη κώδικα που αυτοματοποιεί τη μεταφορά δεδομένων που είναι αποθηκευμένα σε σχεσιακούς πίνακες βάσεων δεδομένων σε αντικείμενα Python που χρησιμοποιούνται στον κώδικα Python. Οι ORM παρέχουν μια αφαίρεση υψηλού επιπέδου σε μια σχεσιακή βάση δεδομένων που επιτρέπει σε έναν προγραμματιστή να γράφει κώδικα Python αντί για σύνταξη SQL για τη δημιουργία, ανάγνωση, ενημέρωση και διαγραφή δεδομένων και σχημάτων στη βάση δεδομένων τους. Οι προγραμματιστές μπορούν να χρησιμοποιήσουν τη γλώσσα προγραμματισμού Python με την οποία είναι άνετα αντί να γράφουν δηλώσεις SQL ή αποθηκευμένες διαδικασίες.

Ένα παράδειγμα ενός πλαισίου ORM για το Python είναι το SQLAlchemy. Το SQLAlchemy ORM παρουσιάζει μια μέθοδο συσχέτισης κατηγοριών Python που καθορίζονται από τον χρήστη με πίνακες βάσης δεδομένων και παρουσίες αυτών των τάξεων (αντικείμενα) με σειρές στους αντίστοιχους πίνακες τους. Περιλαμβάνει ένα σύστημα που συγχρονίζει με διαφάνεια όλες τις αλλαγές στην κατάσταση μεταξύ αντικειμένων και των σχετικών σειρών τους. Τα πλαίσια ιστού όπως η φιάλη χρησιμοποιούν το SQLAlchemy για την αποθήκευση δεδομένων συνεχώς.

Django ORM: Το Django έρχεται με το δικό του ORM ή μοντέλο για συντομία.Το μοντέλο είναι η μοναδική, οριστική πηγή πληροφοριών για τα δεδομένα σας. Περιέχει τα βασικά πεδία και τις συμπεριφορές των δεδομένων που αποθηκεύετε. Γενικά, κάθε μοντέλο αντιστοιχεί σε έναν πίνακα βάσης δεδομένων. Το Django Model καθιστά επίσης δυνατή την εναλλαγή μεταξύ διάφορων σχεσιακών βάσεων δεδομένων, όπως Oracle SQL, MySQL ή MSSQL.

Χρησιμοποιώντας το Django ORM για να προσθέσετε έγγραφα στο MongoDB

Ας υποθέσουμε ότι θέλετε να δημιουργήσετε μια πλατφόρμα blogging χρησιμοποιώντας το Django με το MongoDB ως το backend σας.

Στο app/models.pyαρχείο ιστολογίου σας ορίστε το BlogContentμοντέλο:

from djongo import modelsfrom djongo.models import forms
class BlogContent(models.Model): comment = models.CharField(max_length=100) author = models.CharField(max_length=100) class Meta: abstract = True

Για να αποκτήσετε πρόσβαση στο μοντέλο χρησιμοποιώντας το Django Admin, θα χρειαστείτε ορισμό φόρμας για το παραπάνω μοντέλο. Ορίστε το όπως φαίνεται παρακάτω:

class BlogContentForm(forms.ModelForm): class Meta: model = BlogContent fields = ( 'comment', 'author' )

Τώρα "ενσωματώστε" το BlogContentεσωτερικό σας BlogPostχρησιμοποιώντας τα EmbeddedModelFieldπαρακάτω:

class BlogPost(models.Model): h1 = models.CharField(max_length=100) content = models.EmbeddedModelField( model_container=BlogContent, model_form=BlogContentForm ) 

Αυτό είναι έτοιμο! Ενεργοποιήστε το Django Admin στο localhost: 8000 / admin / και αυτό είναι που έχετε:

Στη συνέχεια, ας υποθέσουμε ότι θέλετε να "επεκτείνετε" το πεδίο συγγραφέα ώστε να περιέχει περισσότερα από το όνομα. Χρειάζεστε και ένα όνομα και ένα email. Απλώς κάντε το πεδίο συγγραφέα ένα "ενσωματωμένο" πεδίο αντί για ένα πεδίο "char":

class Author(models.Model): name = models.CharField(max_length=100) email = models.CharField(max_length=100) class Meta: abstract = Trueclass AuthorForm(forms.ModelForm): class Meta: model = Author fields = ( 'name', 'email' )
class BlogContent(models.Model): comment = models.CharField(max_length=100) author = models.EmbeddedModelField( model_container=Author, model_form=AuthorForm ) class Meta: abstract = True

Εάν μια ανάρτηση ιστολογίου έχει πολλαπλό περιεχόμενο από πολλούς συγγραφείς, ορίστε ένα νέο μοντέλο:

class MultipleBlogPosts(models.Model): h1 = models.CharField(max_length=100) content = models.ArrayModelField( model_container=BlogContent, model_form=BlogContentForm )

Ενεργοποιήστε το Django Admin με τις νέες αλλαγές και έχετε:

Τρόποι ενσωμάτωσης του Django και του MongoDB.

Το Django ORM αποτελείται από πολλαπλά στρώματα αφαίρεσης που στοιβάζονται το ένα πάνω στο άλλο.

Ως προγραμματιστής ιστού, μπορείτε να ανταποκριθείτε στην πρόκληση της σύνδεσης του Django με το MongoDB με δύο τρόπους. Ρίξτε μια ματιά στη στοίβα πλαισίου Django παραπάνω για να μαντέψετε τα πιθανά σημεία εισόδου.

Χρησιμοποιήστε ένα μοντέλο συμβατό με MongoDB

Μπορείτε να αποφύγετε εντελώς τη χρήση των μοντέλων Django που περιλαμβάνονται στις μπαταρίες στο έργο σας. Αντ 'αυτού, χρησιμοποιήστε ένα πλαίσιο τρίτου μέρους όπως το MongoEngine ή το Ming σε σας Django έργα.

Επιλέγοντας ένα διαφορετικό μοντέλο σημαίνει ότι χάνετε:

  • 1500+ βασικοί συνεισφέροντες στο έργο
  • Ωριαίες διορθώσεις και ανάλυση εισιτηρίων

Θα βελτιώσετε την εμπειρία των υπαρχόντων μοντέλων Django και θα βελτιώσετε το νέο πλαίσιο μοντέλου. Αλλά ίσως το μεγαλύτερο μειονέκτημα είναι ότι το έργο σας δεν μπορεί να χρησιμοποιήσει κανένα από τα μοντέλα του Django! Ξεχάστε τη χρήση του διαχειριστή, των περιόδων σύνδεσης, των χρηστών, του Auth και άλλων ενοτήτων συνεισφοράς για το έργο σας.

Μερικά από αυτά τα μειονεκτήματα αντισταθμίζονται με τη δημιουργία ενός νέου κλάδου του Django. Το Django-nonrel είναι ένας ανεξάρτητος κλάδος του Django που προσθέτει υποστήριξη βάσεων δεδομένων NoSQL στο Django. Το Django-nonrel επιτρέπει τη σύνταξη φορητών εφαρμογών Django. Ωστόσο, η διεπαφή διαχειριστή δεν λειτουργεί πλήρως. Δεν υπάρχει ενεργή ανάπτυξη στο έργο Django-nonrel.

Το Django MongoDB Engine είναι ένα άλλο backend του MongoDB για το Django, το οποίο είναι ένα πιρούνι από το MongoEngine ODM.

Django SQL σε MongoDB transpiler - Djongo

Μια άλλη προσέγγιση είναι να μεταφράσουμε τη σύνταξη ερωτήματος Django SQL που δημιουργήθηκε από το Django ORM σε εντολές pymongo. Το Djongo είναι ένα τέτοιο μεταγλωττιστή ερωτημάτων SQL σε MongoDB. Μεταφράζει κάθε συμβολοσειρά ερωτήματος SQL σε ένα έγγραφο ερωτήματος mongoDB. Ως αποτέλεσμα, όλα τα μοντέλα Django και οι σχετικές ενότητες λειτουργούν ως έχουν. Με αυτήν την προσέγγιση, κερδίζετε:

  • Επαναχρησιμοποίηση μοντέλων Django: Το Django είναι ένα σταθερό πλαίσιο με συνεχή ανάπτυξη και βελτιώσεις. Το Django ORM είναι αρκετά εκτεταμένο και πλούσιο σε χαρακτηριστικά. Ο ορισμός ενός ORM τρίτου μέρους για συνεργασία με το MongoDB σημαίνει την αναπαραγωγή ολόκληρου του Django ORM ξανά. Το νέο ORM πρέπει να ευθυγραμμίζεται συνεχώς με το Django ORM. Αρκετές δυνατότητες του Django δεν θα γίνουν ποτέ στο ORM τρίτων. Η ιδέα με το Djongo είναι να επαναχρησιμοποιηθούν οι υπάρχουσες δυνατότητες του Django ORM μεταφράζοντας τελικά τα ερωτήματα SQL στη σύνταξη MongoDB.
  • Η σύνταξη SQL δεν θα αλλάξει ποτέ ανεξάρτητα από τις μελλοντικές προσθήκες στο Django. Χρησιμοποιώντας το Djongo, το έργο σας είναι πλέον μελλοντική απόδειξη!

Κάνοντας το Django να λειτουργεί με το MongoDB

Εξομοίωση σχήματος στο MongoDB: Παρόλο που δεν υπάρχει υποστήριξη σχήματος στο MongoDB, αυτό μπορεί να προσομοιωθεί. Το Djongo παρέχει την υποστήριξη σχήματος που απαιτείται στο Django χρησιμοποιώντας και καθορίζοντας έναν συνδυασμό κανόνων επικύρωσης MongoDB και δημιουργώντας μια __schema__συλλογή. Η __schema__συλλογή αποθηκεύει πληροφορίες για υποστηρικτικές λειτουργίες όπως το κλειδί SQL AUTOINCREMENT.

ΕΓΓΡΑΦΕΙΤΕ υποστήριξη στο MongoDB: Στην έκδοση 3.2, το MongoDB παρουσίασε τον $lookupχειριστή. Εκτελεί έναν αριστερό εξωτερικό σύνδεσμο σε μια συλλογή στην ίδια βάση δεδομένων για να φιλτράρει τα έγγραφα από τη συλλογή "ενωμένοι" για επεξεργασία. Το $lookupστάδιο ταιριάζει με την ισότητα μεταξύ ενός πεδίου από τα έγγραφα εισαγωγής με ένα πεδίο από τα έγγραφα της συλλογής "ενώνεται".

To each input document, the $lookup stage adds a new array field whose elements are the matching documents from the “joined” collection. The $lookup stage passes these reshaped documents to the next stage.

Djongo uses the $lookup aggregation operator to perform all Django related JOIN queries. This is how it makes admin and other contrib modules work as is.

Transaction support in MongoDB: Despite the power of single-document atomic operations, there are cases that require multi-document transactions. When executing a transaction composed of sequential operations, certain issues arise, wherein if one operation fails, the previous operation within the transaction must “rollback” to the previous state — that is, the “all or nothing.”

For situations that require multi-document transactions, Djongo implements the two-phase commit pattern to provide support for these kinds of multi-document updates. Using two-phase commit ensures that data is consistent and, in case of an error, the state that preceded the transaction is recoverable.

Djongo comes with its own set of compromises, though. So what are the disadvantages of opting to use Djongo for your Django project?

Performance: The Django ORM does the heavy lifting of converting complex object manipulations to standard SQL query strings. If your backend database was SQL-based, you could pass this query string directly to it with almost no post-processing. With Djongo, however, the query string will now have to be converted into a MongoDB query document.

Αυτό θα απαιτήσει μερικούς κύκλους CPU. Αλλά εάν οι επιπλέον κύκλοι CPU είναι πραγματικά ένα τέτοιο πρόβλημα, πιθανότατα δεν θα πρέπει να χρησιμοποιείτε το Python.

συμπέρασμα

Σας πήρα πολλούς τρόπους ενσωμάτωσης του Django στο MongoDB Θα βρείτε μια πληθώρα διαδικτυακής βιβλιογραφίας που περιγράφει το MongoEngine και άλλες παραλλαγές για να το κάνετε αυτό.

Επικεντρώθηκα στο Djongo που είναι ένας νέος σύνδεσμος που το καθιστά δυνατό με διαφορετικό τρόπο. Είναι εύκολο στη χρήση και κάνει τη διαδικασία μετεγκατάστασης από SQL backend στο MongoDB πολύ απλή, προσθέτοντας μόνο μία γραμμή κώδικα .