Foarte simplu, dar puternic si extensibil Document Document Mapper pentru RethinkDB, scris in Python.

Este simplu!

de la remodel.models import Clasa model User (Model): pass

Asta este cu adevarat tot ce trebuie sa faceti pentru a configura un model!

Nu uitati sa porniti serverul RethinkDB si sa va creati tabelele (consultati exemplele de mai jos pentru un ajutor care face exact asta!).

Caracteristici

  • nesimtit;
  • interfata dict;
  • sprijin deplin pentru relatii;
  • indicii;
  • conventie asupra configuratiei;
  • lenes-incarcare;
  • stocarea in cache;
  • testat temeinic;

Instalare

Exemple

Operatii de baza CRUD

clasa Comanda (Model): pass # Create my_order = Order.create (client = ‘Andrei’, shop = ‘GitHub’) # Update my_order [‘total’] = 100 my_order.save () # Citeste saved_order = Order.get ( client = ‘Andrei’) # Sterge salvat_ordine.delete ()

Crearea tabelelor

de la remodel.models import Model de la remodel.helpers import create_tables, create_indexes clasa Party (Model): has_many = (‘Guest’,) class Guest (Model): appartine_to = (‘Party’,) # Creeaza toate tabelele bazei de date definite de modele create_tables () # Creeaza toti indexurile tabelelor pe baza relatiilor model create_indexes ()

Configurarea conexiunii la baza de date

Configurarile sunt foarte diferite, deci iata cum trebuie sa configurati remodelarea pentru a va conecta la baza de date RethinkDB:

din remodel.connection import pool pool.configure (host = ‘localhost’, port = 28015, auth_key = None, user = ‘admin’, password = ”, db = ‘test’)

Relatii

Are unul / apartine

clasa Utilizator (Model): has_one = (‘Profil’,) clasa Profil (Model): apartine_to = (‘Utilizator’,) andrei = Utilizator.create (nume = ‘Andrei’) profil = Profil.create (utilizator = andrei, network = ‘GitHub’, username = ‘linkyndy’) imprima profilul [‘user’] [‘name’] # printuri Andrei

Are multe / apartine

clasa Tara (Model): has_many = (‘Oras’,) clasa Oras (Model): appartine_to = (‘Tara’,) romania = Tara.create (nume = ‘Romania’) romania [‘orase’] (nume = ‘Timisoara’), oras (nume = ‘Bucuresti’)) print romania [‘orase’]. count () # printuri 2

Are si apartine multora

class Post (Model): has_and_belongs_to_many = (‘Tag’,) class Tag (Model): has_and_belongs_to_many = (‘Post’,) my_post = Post.create (name = ‘Primul meu post’) personal_tag = Tag.create (name = ‘personal’) public_tag = Tag.create (name = ‘public’) my_post [‘tags’]. add (personal_tag, public_tag) print my_post [‘tags’]. count () # printuri 2

Are multe prin

class Reteta (Model): has_many = (‘SpecificSpice’,) class Chef (Model): has_many = (‘SpecificSpice’,) class SpecificSpice (Model): appartine_to = (‘Reteta’, ‘Chef’) quattro_formaggi = Recipe.create (name = ‘Pizza Quattro Formaggi’) andrei = Chef.create (name = ‘Andrei’) andreis_special_quattro_formaggi = SpecificSpice.create (chef = andrei, recipe = quattro_formaggi, oregano = True, love = True) print andreis_special_quatro_formaggi [‘love’] # imprima Adevarat

Rambursari

de la remodel.models import Clasa model Camasa (Model): def after_init (self): self.wash () def wash (self): imprimati „Trebuie sa spalati o camasa dupa ce ati creat-o …

follada real coños calientes
videos porno peruano fiestas porno
follate a mi novia porno tv
porno en cine convencional porni
porno trans amas de casa follando
cine para adultos gratis pornox
miriam sanchez videos porno española follando
peliculas eroticas gratis en español porno fiestas
maduritas cachondas incesto x
abuela porno largeporntube
videos porno casero españa tias corriendose
videos eroticos italianos todoporno
casadas muy putas pilladas desnudas
folladas extremas madresxxx
follada en tanga maduras folladoras
maduras peludas españolas maduras en la playa
incesto subtitulado español mujer masturbandose
follar abuelas masturbaciones
gordibuenas españolas p0rno
porno gratis anal michelle jenner desnuda

sau

de la remodel.models import Model, after_save class Prize (Model): @after_save def brag (self): print ‘Tocmai am castigat un premiu!’

Numele tabelului personalizat

clasa Copil (Model): table_name = ‘copii’ tipareste Child.table_name # tipareste ‘copii’

Interogari de model personalizate

import repenseaza ca clasa r Celebrity (Model): pass Celebrity.create (name = ‘george clooney’) Celebrity.create (name = ‘kate winslet’) upper = Celebrity.map ({‘name’: r.row [‘name ‘] .upcase ()}). run () lista de imprimare (sus) # printuri [{u’name’: u’GEORGE CLOONEY ‘}, {u’name’: u’KATE WINSLET ‘}]

Metode de instanta personalizate

clasa Copil (Model): def is_minor (self): if ‘age’ in self: return self [‘age’] <18 jack = Child.create (name = ‘Jack’, age = 15) jack.is_minor () # imprima True

Metode de clasa personalizate

din remodel.object_handler import ObjectHandler, clasa ObjectSet TripObjectHandler (ObjectHandler): def in_europe (self): return ObjectSet (self, self.query.filter ({‘continent’: ‘Europe’})) clasa Trip (Model): object_handler = TripObjectHandler Trip.create (continent = ‘Europa’, oras = ‘Paris’) Trip.create (continent = ‘Asia’, oras = ‘Shanghai’) Trip.create (continent = ‘Europa’, oras = ‘Dublin’) print len (Trip.in_europe ()) # printuri 2

Vizualizarea campurilor obiect

class Train (Model): pass train = Train.create (nr = 12345, destination = ‘Paris’, has_restaurant = True, classes = [1, 2]) print train.fields.as_dict () # prints {u’classes ‘ : [1, 2], u’nr ‘: 12345, u’destination’: u’Paris ‘, u’has_restaurant’: True, u’id ‘: u’d9b8d57f-5d67-4ff7-acf8-cbf7fdd65581’}

Concepte

Relatii

Remodelarea accepta diferite tipuri de relatii:

  • are unul
  • apartine lui
  • are multe
  • are si apartine multora
  • are multe prin

Definirea relatiilor

Modelele conexe sunt transmise ca tupluri in definitia unui model. Toate celelalte aspecte, cum ar fi tastele straine, indexurile, incarcarea lenesa a relatiei si memoria cache a relatiilor sunt tratate in mod magic pentru dvs.

Daca aveti nevoie de o definitie precisa pentru modelele dvs. conexe, puteti trece un tupl de configurare in locul numelui sirului modelului dvs. asociat:

clasa Artist (Model): has_many = ((‘Melodie’, ‘melodii’, ‘id’, ‘melodie_id’), ‘Concert’) # Definitie tupla: (<nume model asociat>, <camp accesor obiecte conexe>, < cheie model>, <cheie model asociata>)

Un lucru important de observat este ca relatiile inverse nu sunt asigurate automat daca este definit doar un capat al relatiei. Aceasta inseamna ca, daca artistul are_multa melodie, melodia apartine artistului nu este aplicata automat, cu exceptia cazului in care este definita in mod explicit.

Folosirea relatiilor

Atribuirea has_one si appartine_ obiectelor nu inseamna ca acestea sunt persistente. Trebuie sa apelati manual save () pe ele; presupunand ca profilul apartine utilizatorului:

profile [‘user’] = Utilizator (…) profile.save ()

Pe de alta parte, atribuirea obiectelor has_many si has_and_belongs_to_many le persista automat, deci nu este nevoie sa apelati save () pe ele; presupunand ca magazinul are multe produse:

shop.add (product1, produt2) # Nu este nevoie sa apelati save () pentru produse!

Retineti ca anumite alocari de obiecte conexe nu pot fi efectuate decat daca unul (sau ambele) dintre obiecte este salvat. Nu puteti salva un GiftSize cu un Cadou atasat fara a salva mai intai obiectul Gift (atunci cand aveti un GiftSize apartine cadoului).

Documentatie

Poate fi gasit la https://github.com/linkyndy/remodel/wiki.

Motivatie

Motivul principal pentru existenta lui Remodel a fost necesitatea unui ODM usor pentru RethinkDB, unul care sa nu va oblige sa asigurati o schema de documente, care sa ofere o interfata familiara si care sa gestioneze cu gratie relatiile dintre modele.

stare

Remodelarea este in curs de dezvoltare activa si nu este inca pregatita pentru productie.

Cum sa contribui?

Orice contributie este foarte apreciata! Consultati CONTRIBUTING.md pentru mai multe detalii.

Licenta

A se vedea LICENTA