Acesta este un ORM usor scris in Python si construit deasupra Cloud Spanner. Acesta nu este un produs Google acceptat oficial.

Notiuni de baza

Cum sa instalati

Asigurati-va ca Python 3.7 este versiunea implicita a python pentru mediul dvs., apoi rulati: pip install git + https: //github.com/google/python-spanner-orm#egg=spanner_orm

Conectarea

Pentru a conecta Spanner ORM la o baza de date Spanner existenta:

import spanner_orm spanner_orm.connect (nume_instanta, nume_baza)

proiectul si acreditarile sunt parametri optionali, iar biblioteca client Spanner standard va incerca sa le deduca automat daca nu este specificata. Un pool de sesiuni poate fi, de asemenea, specificat de parametrul pool, daca este necesar. O explicatie a grupurilor de sesiuni poate fi gasita aici, dar implementarea TransactionPingingPool in bibliotecile client standard Spanner pare sa nu functioneze, iar codul de fir asociat cu utilizarea PingingPool pare sa nu faca ceea ce se intentioneaza (ping pool-ul din cand in cand )

Crearea unui model

Pentru a scrie si a citi dintr-un tabel de pe Spanner, trebuie sa spuneti ORM despre tabel scriind o clasa de model, care arata cam asa:

import spanner_orm class TestModel (spanner_orm.Model): __table__ = ‘TestTable’ # Nume tabel in Spanner __interleaved__ = Niciun # Nume tabel in care tabelul curent este intercalat #. Nici unul sau omis daca tabelul nu este intercalat # Fiecare coloana din tabel are un camp corespunzator, unde primul parametru # este tipul de camp. Cheia primara este construita de campurile etichetate # cu primar_cheie = Adevarat in ordinea in care apar in clasa. # Numele coloanei este acelasi cu numele atributului clasei id = spanner_orm.Field (spanner_orm.String, primary_key = True) value = spanner_orm.Field (spanner_orm.Integer, nullable = True) number = spanner_orm.Field ( spanner_orm.Float, nullable = True) # indexurile secundare sunt specificate intr-un mod similar campurilor: value_index = spanner_orm.Index ([‘value’) ]) # Pentru a indica faptul ca exista o relatie de cheie straina de la acest tabel la # alta, utilizati un ForeignKeyRelationship. foreign_key = spanner_orm.ForeignKeyRelationship (‘OtherModel’, {‘referencing_key’: ‘referenced_key’})

Daca modelul nu se refera la un tabel existent pe Spanner, putem crea tabelul corespunzator din baza de date prin ORM intr-unul din cele doua moduri. Daca baza de date nu a fost inca creata, o putem crea si tabelul in acelasi timp prin:

admin_api = spanner_orm.connect_admin (‘nume_instanta’, ‘nume_baza’, create_ddl = spanner_orm.model_creation_ddl (TestModel)) admin_api.create_database ()

Daca baza de date exista deja, putem executa o migrare in cazul in care metoda de actualizare returneaza un CreateTable pentru modelul pe care tocmai l-ati definit (a se vedea sectiunea despre migrari)

Preluarea datelor din Spanner

Toate interogarile prin Spanner au loc intr-o tranzactie. ORM se asteapta, de obicei, ca o tranzactie sa fie prezenta si furnizata, dar daca nu se specifica Niciuna, va fi creata o noua tranzactie pentru acea solicitare. Cele doua modalitati principale de recuperare a datelor prin ORM sunt where () si find () / find_multi ():

# unde () se invoca pe o clasa de modele pentru a prelua modele de acel tip. este nevoie de # o secventa de conditii. Majoritatea conditiilor care specifica un camp, index, # relatie sau model pot lua fie numele obiectului, fie obiectul # insusi test_objects = TestModel.where (spanner_orm.greater_than (‘valoare’, ’50’)) # Pentru a prelua, de asemenea, obiecte conexe, ar trebui folosita conditia include (): test_and_other_objects = TestModel.where (spanner_orm.

folladas en el metro maduras sensuales
video sexo porno español trios
shemalehd porno español abuelas
videos de chicas gratis abuelas por el culo
madre follada a la fuerza maduras gozando
necrofilia xxx masajes porno en español
jovencitas masturbandose porno españolas peludas
familia española follando española viciosa
zoofila peliculas porno subtituladas en español
pillados follando infraganti creampie española
follando en el convento videos porno corridas internas
super mamadas incesto abuelas
porno guey alexa grace
moras follando porno traducido al español
lisbianas maduras gordibuenas
incesto abuelas megan montaner follando
españolas follando por dinero taboo.com
pajas en coche chica se masturba
maduras a cuatro patas videos chicas gratis
tetas amateur parejitas españolas follando

greater_than (TestModel.value, ’50’), spanner_orm.includes (TestModel.fake_relationship),) # Pentru a crea o tranzactie, executati_read_only () sau run_write () sunt folosite cu metoda # care urmeaza sa fie rulata in cadrul tranzactiei si orice argumente pentru a trece la metoda. # Metoda este invocata cu tranzactia ca primul argument si apoi # restul argumentelor furnizate: def callback_1 (tranzactie,

Scrieti date catre Spanner

Cel mai simplu mod de a scrie date este sa creati un model (sau sa il preluati si sa il modificati) si apoi sa apelati save () pe acesta:

test_model = TestModel ({‘key’: ‘key’, ‘value’: 1}) test_model.save ()

Retineti ca crearea unui model conform celor de mai sus va esua daca exista deja un rand in baza de date in care se potriveste cheia principala, deoarece foloseste un Spanner INSERT in loc de UPDATE, deoarece ORM considera ca este un obiect nou, deoarece nu a fost recuperat de la Spanner.

Pentru modificarea mai multor obiecte in acelasi timp, se poate utiliza metoda Model save_batch ():

models = [] for i in range (10): key = ‘test _ {}’. format (i) models.append (TestModel ({‘key’: key, ‘value’: value})) TestModel.save_batch (models )

spanner_orm.spanner_api (). run_write () poate fi utilizat pentru executarea tranzactiilor de citire-scriere, sau decoratorul transactional_write poate fi utilizat in mod similar cu decoratorul de citire mentionat mai sus. Retineti ca, daca o tranzactie esueaza din cauza modificarii datelor dupa ce s-a intamplat citirea si inainte de finalizarea executarii tranzactiei, metoda apelata va fi reluata pana cand va avea succes sau se va produce un anumit numar de esecuri. Asigurati-va ca nu exista efecte secundare care ar putea provoca probleme daca sunteti apelat de mai multe ori. Exceptiile aruncate din metoda apelata vor anula tranzactia.

Exista si alte metode de asistenta pentru cazuri de utilizare mai complexe (creati, actualizati, revizuiti si altele), dar va trebui sa faceti mai multa munca pentru a le utiliza corect. Consultati documentatia despre aceste metode pentru mai multe informatii.

Migratii

Crearea migratiilor

Rularea spanner-orm generate <nume de migrare> va genera un nou fisier de migrare care va fi completat in directorul specificat (sau „migrari” in mod implicit). Functia de upgrade este executata la migrare, iar functia de downgrade este executata la derularea migrarii. Fiecare dintre acestea ar trebui sa returneze un singur obiect MigrationUpdate (de exemplu, CreateTable, AddColumn etc.), deoarece Spanner nu poate executa mai multe actualizari de schema in mod atomic.

Executarea migratiilor

Rularea spanner-orm migrate <Spanner instance> <Spanner database> va executa toate migratiile nemigrate pentru baza de date respectiva in ordinea corecta, utilizand acreditarile implicite ale aplicatiei. Daca acest lucru nu va functiona pentru cazul dvs. de utilizare, MigrationExecutor poate fi folosit in schimb:

connection = spanner_orm.SpannerConnection (nume_instanta, nume_baza, acreditari) executor = spanner_orm.MigrationExecutor (conexiune) executor.migrate ()

Retineti ca nu exista protectie impotriva incercarii de a executa migratii simultan de mai multe ori, asa ca incercati sa nu faceti acest lucru.

Daca o migrare trebuie sa fie redusa, spanner-orm rollback <migration_name> <Spanner instance> <Spanner database> sau metoda corespunzatoare MigrationExecutor trebuie utilizata.

Teste

Nota: va sugeram sa utilizati un virtualenv Python 3.7 pentru a rula teste si verificarea tipului.

Inainte de a rula orice test, va trebui sa descarcati Cloud Spanner Emulator. Consultati https://github.com/GoogleCloudPlatform/cloud-spanner-emulator pentru mai multe optiuni. Daca sunteti pe Linux, va recomandam:

VERSION = 1.2.0 wget https://storage.googleapis.com/cloud-spanner-emulator/releases/${VERSION}/cloud-spanner-emulator_linux_amd64-${VERSION}.tar.gz tar zxvf cloud-spanner-emulator_linux_amd64 – $ {VERSION} .tar.gz chmod u + x gateway_main emulator_main
git clone [email protected]: GoogleCloudPlatform / cloud-spanner-emulator.git

Pentru a verifica adnotarile de tip, rulati:

pip install pytype # https://github.com/google/pytype/issues/80#issuecomment-385128856 pytype -V 3.7 spanner_orm -d import-error

Pentru a verifica formatarea, rulati (schimbati –diff in –in-place pentru a remedia formatarea):

pip instaleaza yapf yapf –diff –recursiv –paralel.

Apoi executati teste cu:

SPANNER_EMULATOR_BINARY_PATH = $ (pwd) / emulator_main python3 setup.py test