Kuinka käyttää Djangoa MongoDB: n kanssa lisäämällä vain yksi koodirivi.

Kuinka käyttää Djangoa MongoDB: n kanssa lisäämällä vain yksi koodirivi.

Jos haluat käyttää MongoDB: tä backend-tietokantana Django-projektissasi, lisää tämä yksi rivi settings.py-tiedostoon:

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

Se on niin yksinkertaista!

Kirjaudu seuraavaksi järjestelmänvalvojan kotiin (paikallinen isäntä: 8000 / admin /) ja ala lisätä upotettuja asiakirjoja MongoDB: hen käyttämällä järjestelmänvalvojan käyttöliittymää:

Lokakuussa 2017 MongoDB viimeisteli viimeisen vaiheen julkisen kaupankäynnin kohteeksi hinnoittelemalla listautumisanninsa 24 dollariin ja keräten 192 miljoonaa dollaria prosessin aikana. Yhtiön talous on kasvanut tasaisesti:

MongoDB tarjoaa avoimen lähdekoodin tietokantaohjelmiston. Tämä on erittäin hyödyllistä varhaisessa vaiheessa aloittaville yrityksille, jotka haluavat käynnistää samalla kun tiukat budjetit rajoittavat sitä. MongoDB: n Googlen hakutrendien tarkastelu paljasti kiinnostuksen tasaisen kasvun.

MongoDB: stä on tullut yhä suosittu tietokantaohjelmisto, jonka kanssa työskennellä. Tietokannat ja tietokannan hallintajärjestelmät (DBMS) ovat olleet olemassa yli viiden vuosikymmenen ajan. Ne syntyivät 1960-luvun alussa, ja suosituin maku oli relaatiotietokantajärjestelmä.

Mutta MongoDB kiertää itseään "ei-suhteellisena" tietokantajärjestelmänä ja on esittänyt korkeita väitteitä tietojensa säilyttämistä koskevasta lähestymistavastaan. Joten mikä on BIG-sopimus täällä?

MongoDB vs SQL

Melkein kaikki relaatiotietokantajärjestelmät käyttävät strukturoitua kyselykieltä (SQL) (tai sen muutettua versiota) kommunikoimaan tiedonhallintaohjelmiston kanssa. Useat yliopistokurssit on omistettu yksinomaan SQL-syntaksin ymmärtämiselle ja hallitsemiselle.

SQL: stä oli tullut tosiasiallinen kieli työskennellessä minkä tahansa tietokantaohjelmiston, omistamien tai avoimen lähdekoodin kanssa. Sitten MongoDB tuli mukaan ja päätti olla täysin välinpitämätön tälle muinaiselle valtakielelle ja otti käyttöön oman kyselyn syntaksin.

Kieli on Mordorin kieli, jota en sano tässä. Yhteisessä kielessä sanotaan: ”Yksi rengas hallitsee heitä kaikkia. Yksi rengas niiden löytämiseksi. Yksi rengas tuoda ne kaikki ja pimeydessä sitovat niitä.”- Gandalf ( alkaen Taru renkaat )

MongoDB Schemaless vs SQL Schema: SQL-tietokannassa on mahdotonta lisätä tietoja, ennen kuin määrität taulukoita ja kenttätyyppejä skeemana. MongoDB-tietokannassa tietoja voidaan lisätä mihin tahansa, milloin tahansa. Asiakirjan suunnittelua tai edes kokoelmaa ei tarvitse määrittää etupuolella.

MongoDB-asiakirjat vs SQL-taulukot: SQL-tietokannat tarjoavat tallennuksen liittyviin tietotaulukoihin. Jokainen rivi on erilainen ennätys. Suunnittelu on jäykkä: et voi käyttää samaa taulukkoa erilaisten tietojen tallentamiseen tai merkkijonon lisäämiseen siellä, missä lukua odotetaan.

MongoDB-tietokanta tallentaa JSON-tyyppiset kenttä-arvo-paridokumentit. Samanlaisia ​​asiakirjoja voidaan tallentaa SQL-taulukon kanssa analogiseen kokoelmaan. Voit kuitenkin tallentaa haluamasi tiedot mihin tahansa asiakirjaan - MongoDB ei valittaa. SQL-taulukot luovat tiukan tietomallin, joten on vaikea tehdä virheitä. MongoDB on joustavampi ja anteeksiantavampi, mutta tietojen tallentaminen mihin tahansa voi johtaa johdonmukaisuusongelmiin.

Saatavilla on runsaasti online-sisältöä, joka väittää, että MongoDB ei ole SQL: n superset. SQL: ssä toimivia sovelluksia ei voida siirtää MongoDB: hen. Menen raajaan väittämään, että Djangon yhteydessä MongoDB on SQL: n superset .

Joten miksi yleisesti uskotaan, että MongoDB ei ole SQL: n supersarja, on olemassa aluksi?

MongoDB vaatii tietojen denormalisointia : MongoDb : ssä ei ole JOIN-tukea. Tämä tarkoittaa sitä, että meidän on denormaloitava asiakirjamme. Denormalisoidut asiakirjat johtavat nopeampiin kyselyihin, mutta asiakirjakenttätietojen päivittäminen useissa denormalisoiduissa asiakirjoissa on huomattavasti hitaampaa.

JOIN-tiedostoja ei ole : SQL-kyselyt tarjoavat tehokkaan JOIN-lausekkeen. Voimme saada asiaan liittyviä tietoja useissa taulukoissa yhdellä SQL-käskyllä. Ei-relaatiotietokannoissa, kuten MongoDB, ei ole JOIN-tiedostoja, kuten relaatiotietokannoissa. Tämä tarkoittaa, että sinun on tehtävä useita kyselyitä ja liitettävä tiedot manuaalisesti koodiin.

Ei tapahtumia: SQL-tietokannoissa voidaan suorittaa kaksi tai useampia päivityksiä tapahtumassa - kaikki tai ei mitään -kääre, joka takaa onnistumisen tai epäonnistumisen. Jos suoritamme kaksi päivitystä erikseen, toinen voi onnistua ja toinen epäonnistua - jättäen luvut synkronoimatta. Samojen päivitysten sijoittaminen tapahtumaan varmistaa, että molemmat onnistuvat tai molemmat epäonnistuvat.

Ei vierasavaimen rajoituksia: Useimpien SQL-tietokantojen avulla voit pakottaa tietojen eheyssäännöt käyttämään vierasavaimen rajoituksia. Tämä varmistaa, että kaikilla riveillä on kelvollinen vieras avain koodille, joka vastaa yhtä liittymispöydän merkintää, ja varmistaa, että liittymispöydän tietuetta ei poisteta, jos yksi tai useampi rivi viittaa edelleen niihin.

Kaava pakottaa nämä säännöt noudattamaan tietokantaa. Kehittäjien tai käyttäjien on mahdotonta lisätä, muokata tai poistaa tietueita, mikä voi johtaa virheellisiin tietoihin tai orpotietueisiin. Samat tietojen eheysvaihtoehdot eivät ole käytettävissä MongoDB: ssä. Voit tallentaa haluamasi tiedot muista asiakirjoista riippumatta. Ihannetapauksessa yksi asiakirja olisi ainoa lähde kaikesta tuotteesta.

Tietokantamallin tarve

Objektit ovat Pythonin abstraktio tiedoille. Kaikki Python-ohjelman tiedot esitetään objekteilla tai objektien välisillä suhteilla. Vaikka objektit ovat hyvä tapa edustaa tietoja, ongelma syntyy, kun haluamme tehdä tiedoista pysyviä. Tietomäärä voi olla valtava, ja se on haettava pysyvästä muistista nopeasti ja tehokkaasti. Tätä tietokantaohjelmistoa on käytettävä objektien tallentamiseen. Mahdollinen tietokantaohjelmisto on relaatioon perustuva SQL-pohjainen tietokantaohjelmisto.

Objektisuhdekartoitin (ORM) on koodikirjasto, joka automatisoi relaatiotietokantataulukoihin tallennettujen tietojen siirtämisen Python-objektiin, joita käytetään Python-koodissa. ORM: t tarjoavat korkean tason abstraktin relaatiotietokantaan, jonka avulla kehittäjä voi kirjoittaa Python-koodin SQL-syntaksin sijaan luoda, lukea, päivittää ja poistaa tietoja ja skeemejä tietokantaansa. Kehittäjät voivat käyttää miellyttävää Python-ohjelmointikieliä SQL-käskyjen tai tallennettujen menettelyjen kirjoittamisen sijaan.

Esimerkki ORM-kehyksestä Pythonille on SQLAlchemy. SQLAlchemy ORM esittelee menetelmän käyttäjän määrittelemien Python-luokkien yhdistämiseksi tietokantataulukoihin ja näiden luokkien (objektien) esiintymät vastaavien taulukoiden riveihin. Se sisältää järjestelmän, joka synkronoi läpinäkyvästi kaikki tilan muutokset objektien ja niihin liittyvien rivien välillä. Verkkokehykset, kuten pullo, käyttävät SQLAlchemyä tietojen säilyttämiseen jatkuvasti.

Django ORM: Djangolla on lyhyt oma ORM tai malli.Malli on ainoa, lopullinen tietolähde tiedoistasi. Se sisältää tallentamiesi tietojen olennaiset kentät ja käyttäytymisen. Kukin malli kartoittaa yleensä yhden tietokantataulukon. Django-malli mahdollistaa myös vaihdon erilaisten relaatiotietokantojen, kuten Oracle SQL, MySQL tai MSSQL, välillä.

Django ORM: n avulla voit lisätä asiakirjoja MongoDB: hen

Oletetaan, että haluat luoda blogiympäristön käyttämällä Djangoa ja MongoDB: tä taustakuvana.

Blogissasi app/models.pytiedosto määritellä BlogContentmalli:

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

Mallin käyttäminen Django Admin -sovelluksella edellyttää lomakemääritystä yllä olevalle mallille. Määritä se alla olevan kuvan mukaisesti:

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

Nyt ”upottaa” oman BlogContentsisällä BlogPostkäyttämällä EmbeddedModelFieldalla:

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

Se on se, että olet asetettu! Käynnistä Django Admin paikallisessa isännässä: 8000 / admin / ja saat tämän:

Oletetaan seuraavaksi, että haluat "laajentaa" kirjoittaja-kenttää sisältämään muutakin kuin vain nimen. Tarvitset sekä nimen että sähköpostiosoitteen. Tee vain kirjoittajakentästä upotettu kenttä char-kentän sijaan:

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

Jos blogikirjoituksessa on useita sisältöjä useilta tekijöiltä, ​​määritä uusi malli:

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

Käynnistä Django-järjestelmänvalvoja uusilla muutoksilla ja sinulla on:

Tapoja integroida Django ja MongoDB.

Django ORM koostuu useista päällystekerroksista, jotka on pinottu päällekkäin.

Verkkokehittäjänä voit ottaa haasteen liittää Django MongoDB: hen kahdella tavalla. Katsokaa yllä olevaa Django-kehyspinoa arvataksesi mahdolliset alkupisteet.

Käytä MongoDB-yhteensopivaa mallia

Voit välttää täysin "mukana toimitettujen paristojen" Django-mallien käyttämisen projektissasi. Käytä sen sijaan kolmannen osapuolen kehyksiä, kuten MongoEngine tai Ming, Django-projekteissasi.

Eri mallin valinta tarkoittaa, että menetät:

  • Yli 1500 ydintekijää projektiin
  • Tunneittaiset korjaukset ja lippujen tarkkuus

You’d ramp down on the expertise of existing Django models and ramp up on the new model framework. But perhaps the biggest drawback is that your project can’t use any of Django’s contrib models! Forget about using Admin, Sessions, Users, Auth, and other contrib modules for your project.

Some of these disadvantages are offset by forking a new branch of Django itself. Django-nonrel is an independent branch of Django that adds NoSQL database support to Django. Django-nonrel allows for writing portable Django apps. However, the admin interface does not work fully. There is no active development taking place on the Django-nonrel project.

Django MongoDB Engine is another MongoDB backend for Django which is a fork off the MongoEngine ODM.

Django SQL to MongoDB transpiler — Djongo

Another approach is to translate Django SQL query syntax generated by the Django ORM into pymongo commands. Djongo is one such SQL to MongoDB query compiler. It translates every SQL query string into a mongoDB query document. As a result, all Django models and related modules work as is. With this approach, you gain on:

  • Reuse of Django Models: Django is a stable framework with continuous development and enhancements. The Django ORM is quite extensive and feature-rich. Defining a third party ORM to work with MongoDB means reproducing the entire Django ORM again. The new ORM needs to constantly align with the Django ORM. Several Django features will never make it into the third party ORM. The idea with Djongo is to reuse existing Django ORM features by finally translating SQL queries to MongoDB syntax.
  • SQL syntax will never change regardless of future additions to Django. By using Djongo, your project is now future proof!

Making Django work with MongoDB

Emulating Schema in MongoDB: While there is no schema support in MongoDB, this can be emulated. Djongo provides the schema support required in Django by using and defining a combination of MongoDB validator rules and by creating a __schema__ collection. The __schema__ collection stores information for supporting features like the SQL AUTOINCREMENT key.

JOIN support in MongoDB: In version 3.2, MongoDB introduced the $lookup operator. It performs a left outer join to a collection in the same database to filter in documents from the “joined” collection for processing. The $lookup stage does an equality match between a field from the input documents with a field from the documents of the “joined” collection.

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.

Tämä vaatii joitain suorittimen jaksoja. Mutta jos ylimääräiset suorittimen jaksot ovat todella sellainen ongelma, sinun ei todennäköisesti pitäisi käyttää Pythonia ensin.

Johtopäätös

Esitin sinut läpi useita tapoja integroida Django MongoDB: hen. Löydät lukuisia online-kirjallisuuksia, joissa kuvataan MongoEngine ja muut vaihtoehdot tämän tekemiseksi.

Keskityin Djongoon, joka on uusi liitin, joka tekee tämän mahdolliseksi eri tavalla. Sitä on helppo käyttää ja se tekee siirtymisen SQL-taustasta MongoDB: hen hyvin yksinkertaisen lisäämällä vain yhden koodirivin .