
William Charles
0
3781
424
Być może słyszałeś o mapowaniu obiektowo-relacyjnym (ORM). Być może nawet użyłeś jednego, ale czym one dokładnie są? I jak ich używać w Pythonie?
Oto wszystko, co musisz wiedzieć o ORM i Pythonie.
Co to jest ORM?
Mapowanie obiektowo-relacyjne (ORM) to technika programowania używana do uzyskania dostępu do bazy danych. Naraża bazę danych na szereg obiektów. Nie musisz pisać poleceń SQL, aby wstawiać lub pobierać dane, korzystasz z szeregu atrybutów i metod dołączonych do obiektów.
Może to wydawać się skomplikowane i niepotrzebne, ale mogą zaoszczędzić dużo czasu i pomóc kontrolować dostęp do bazy danych.
Oto przykład. Powiedz, że za każdym razem, gdy wstawiasz hasło do bazy danych, chcesz je zaszyfrować, jak wyjaśniono w zabezpieczeniu hasła do witryny. Każda bezpieczna strona internetowa robi to z Twoim hasłem. Każda bezpieczna strona internetowa robi to z Twoim hasłem. narusza? . Nie stanowi to problemu w prostych przypadkach użycia - obliczenia wykonuje się przed wstawieniem. Ale co, jeśli chcesz wstawić rekord w wielu miejscach kodu? Co jeśli inny programista wstawi się do twojego stołu, a ty nie wiesz o tym?
Korzystając z ORM, możesz napisać kod, aby mieć pewność, że za każdym razem, gdy uzyskiwany jest dostęp do dowolnego wiersza lub pola w bazie danych, najpierw wykonywany jest drugi, niestandardowy kod.
Działa to również jako “jedno źródło prawdy”. Jeśli chcesz zmienić niestandardowe obliczenia, musisz je zmienić tylko w jednym miejscu, a nie w kilku. Wiele z tych zasad można wykonać za pomocą programowania obiektowego (OOP) w języku Python. Przewodnik dla początkujących po programowaniu w języku Python Przewodnik dla początkujących po programowaniu w języku Python Aby w pełni wykorzystać mocne strony języka Python, należy dowiedzieć się, jak Python współpracuje z programowaniem obiektowym (OOP). , ale ORM działają w tandemie z zasadami OOP w celu kontrolowania dostępu do bazy danych.
Są pewne rzeczy, na które należy uważać podczas korzystania z ORM, i są sytuacje, w których możesz nie chcieć z nich korzystać, ale ogólnie uważa się je za dobrą rzecz, szczególnie w dużej bazie kodu.
ORM w Pythonie za pomocą SQLAlchemy
Podobnie jak wiele zadań w Pythonie, importowanie modułu jest szybsze i łatwiejsze niż pisanie własnego. Oczywiście można napisać własną ORM, ale po co wymyślać koło?
Wszystkie poniższe przykłady używają SQLAlchemy, popularnej ORM Pythona, ale wiele zasad ma zastosowanie niezależnie od implementacji.
Konfigurowanie Pythona dla SQLAlchemy
Zanim przejdziesz od razu, musisz skonfigurować swoją maszynę do programowania w języku Python za pomocą SQLAlchemy.
Musisz użyć Python 3.6, aby śledzić te przykłady. Chociaż starsze wersje będą działać, poniższy kod będzie wymagał modyfikacji przed uruchomieniem. Nie jesteś pewien różnic? Najczęściej zadawane pytania dotyczące programowania w języku Python Najczęściej zadawane pytania dotyczące programowania w języku Python W tym artykule przeprowadzimy Cię przez wszystko, co musisz wiedzieć o języku Python jako początkujący. obejmuje wszystkie różnice.
Przed kodowaniem powinieneś skonfigurować środowisko Python. Dowiedz się, jak korzystać ze środowiska wirtualnego Python. Dowiedz się, jak korzystać ze środowiska wirtualnego Python. Niezależnie od tego, czy jesteś doświadczonym programistą Python, czy dopiero zaczynasz, nauka konfiguracji środowiska wirtualnego jest niezbędna. dla każdego projektu w języku Python. , co pozwoli uniknąć problemów z innymi importowanymi pakietami Python.
Upewnij się, że masz PIP, menedżera pakietów Python Jak zainstalować Python PIP na Windows, Mac i Linux Jak zainstalować Python PIP na Windows, Mac i Linux Wielu programistów Python korzysta z narzędzia o nazwie PIP dla Python, aby wszystko było łatwiejsze i szybciej. Oto jak zainstalować Python PIP. zainstalowany, który jest dostarczany z najnowszymi wersjami Pythona.
Gdy będziesz gotowy, możesz zacząć od przygotowania SQLAlchemy. Z poziomu środowiska Python w wierszu polecenia zainstaluj SQLAlchemy za pomocą instalacja pip dowództwo:
pip zainstaluj SQLAlchemy-1.2.9
The 1.2.9 jest numerem wersji. Możesz to wyłączyć, aby uzyskać najnowszą paczkę, ale dobrą praktyką jest sprecyzowanie. Nie wiesz, kiedy nowa wersja może uszkodzić Twój obecny kod.
Teraz możesz rozpocząć kodowanie. Może być konieczne przygotowanie bazy danych do zaakceptowania połączenia w języku Python, ale wszystkie poniższe przykłady wykorzystują bazę danych SQLite utworzoną w pamięci poniżej.
Modele w SQLAlchemy
Jednym z kluczowych elementów ORM jest Model. Jest to klasa Python, która określa, jak powinna wyglądać tabela i jak powinna ona działać. To jest wersja ORM UTWÓRZ TABELĘ instrukcja w SQL. Potrzebujesz modelu dla każdej tabeli w bazie danych.
Otwórz swój ulubiony edytor tekstu lub IDE i utwórz nowy plik o nazwie test.py. Wpisz ten kod startowy, zapisz plik i uruchom go:
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base Base = declarative_base () engine = create_engine ('sqlite: //') # Utwórz bazę danych w pamięci Base.metadata.create_all (silnik) # Utwórz wszystkie tabele w bazie danych
Ten kod robi kilka rzeczy. Importowanie jest konieczne, aby Python wiedział, gdzie znaleźć potrzebne moduły SQLAlchemy. Twoje modele będą korzystać z baza_deklaratywna później konfiguruje wszystkie nowe modele, aby działały zgodnie z oczekiwaniami.
The create_engine Metoda tworzy nowe połączenie z bazą danych. Jeśli masz już bazę danych, musisz ją zmienić sqlite: // do twojego URI bazy danych. W tej chwili ten kod utworzy nową bazę danych tylko w pamięci. Baza danych jest niszczona po zakończeniu wykonywania kodu.
Wreszcie create_all Metoda tworzy wszystkie tabele zdefiniowane w trybach w bazie danych. Ponieważ nie zdefiniowałeś jeszcze żadnych modeli, nic się nie wydarzy. Śmiało i uruchom ten kod, aby upewnić się, że nie masz żadnych problemów ani literówek.
Zróbmy model. Dodaj kolejny import na górze pliku:
z importu sqlalchemy Column, Integer, String
Spowoduje to zaimportowanie Kolumna, Liczba całkowita, i Strunowy moduły z SQLAlchemy. Definiują sposób działania tabel, pól, kolumn i typów danych w bazie danych.
Pod baza_deklaratywna, stwórz swoją klasę modelu:
klasa Samochody (podstawa): __tablename__ = 'samochody' id = Kolumna (liczba całkowita, klucz_ podstawowy = prawda) make = Kolumna (ciąg (50), zerowalne = fałsz) kolor = Kolumna (ciąg (50), nullable = fałsz)
W tym prostym przykładzie użyto samochodów, ale tabele mogą zawierać dowolne dane.
Każda klasa musi dziedziczyć Baza. Nazwa tabeli bazy danych jest zdefiniowana w __Nazwa tabeli__. Powinno to być takie samo jak nazwa klasy, ale jest to tylko zalecenie i nic się nie zepsuje, jeśli się nie dopasują.
Wreszcie, każda kolumna jest zdefiniowana jako zmienna python w klasie. Używane są różne typy danych oraz główny klucz atrybut mówi SQLAlchemy, aby utworzyć ID kolumna jako klucz podstawowy.
Śmiało i dodaj ostatni import, tym razem do ForeignKey moduł. Dodaj to obok swojego Kolumna import:
z importu sqlalchemy Column, ForeignKey, Integer, String
Teraz utwórz drugą klasę modelu. Ta klasa jest nazywana CarOwners, i przechowuje dane właściciela konkretnych samochodów przechowywanych w Samochody stół:
klasa CarOwners (podstawa): __tablename__ = 'carowners' id = Column (Integer, primary_key = True) name = Column (String (50), nullable = False) age = Column (Integer, nullable = False) car_id = Column (Integer, ForeignKey ('cars.id')) samochód = związek (samochody)
Wprowadzono tutaj kilka nowych atrybutów. The car_id pole jest zdefiniowane jako klucz obcy. Jest powiązany z ID w samochody stół. Zauważ, jak używana jest nazwa małej litery tabeli, zamiast nazwy klasy pisanej wielkimi literami.
Wreszcie atrybut samochód jest zdefiniowany jako związek. Dzięki temu Twój model ma dostęp do Samochody tabela za pomocą tej zmiennej. Pokazano to poniżej.
Jeśli uruchomisz teraz ten kod, zobaczysz, że nic się nie dzieje. Wynika to z tego, że jeszcze nie kazałeś robić nic zauważalnego.
Obiekty w SQLAlchemy
Po utworzeniu modeli możesz zacząć uzyskiwać dostęp do obiektów oraz odczytywać i zapisywać dane. Dobrym pomysłem jest umieszczenie logiki we własnej klasie i pliku, ale na razie może pozostać obok modeli.
Zapisywanie danych
W tym przykładzie musisz wstawić niektóre dane do bazy danych, zanim będziesz mógł je odczytać. Jeśli korzystasz z istniejącej bazy danych, możesz już mieć dane. Tak czy inaczej, nadal bardzo przydatne jest wiedzieć, jak wstawiać dane.
Możesz być przyzwyczajony do pisania WSTAWIĆ instrukcje w SQL. SQLAlchemy obsługuje to za Ciebie. Oto jak wstawić jeden wiersz do Samochody Model. Zacznij od nowego importu dla sesyjny twórca:
from sqlalchemy.orm import sessionmaker
Jest to potrzebne do utworzenia sesja i DBSession obiekty, które służą do odczytu i zapisu danych:
DBSession = sessionmaker (bind = engine) session = DBSession ()
Teraz włóż to pod swój create_all komunikat:
car1 = Samochody (marka = „Ford”, kolor = „srebrny”) session.add (car1) session.commit ()
Podzielmy ten kod. Zmienna samochód1 jest zdefiniowany jako obiekt oparty na Samochody Model. Jego marka i kolor są ustawione jako parametry. To jak powiedzenie “uczyń mnie samochodem, ale nie pisz jeszcze tego do bazy danych”. Ten samochód istnieje w pamięci, ale czeka na napisanie.
Dodaj samochód do sesji za pomocą session.add, a następnie zapisz go do bazy danych za pomocą session.commit.
Dodajmy teraz właściciela:
owner1 = CarOwners (name = "Joe", age = "99", car_id = (car1.id)) session.add (owner1) session.commit ()
Ten kod jest prawie identyczny z poprzednią wstawką dla Samochody Model. Główna różnica polega na tym, że car_id jest kluczem obcym, więc potrzebuje identyfikatora wiersza, który istnieje w drugiej tabeli. Jest to dostępne poprzez car1.id własność.
Nie musisz przesyłać zapytań do bazy danych ani zwracać żadnych identyfikatorów, ponieważ SQLAlchemy obsługuje to za Ciebie (o ile najpierw zatwierdzasz dane).
Odczytywanie danych
Po zapisaniu niektórych danych możesz zacząć je ponownie czytać. Oto jak wykonać zapytanie Samochody i CarOwners stoły:
wynik = session.query (Cars) .all ()
To takie proste. Korzystając z pytanie metoda znaleziona w sesja, określasz model, a następnie używasz wszystko metoda, aby pobrać wszystkie wyniki. Jeśli wiesz, że będzie tylko jeden wynik, możesz użyć pierwszy metoda:
wynik = session.query (Cars) .first ()
Po zapytaniu o model i zapisaniu wyników w zmiennej możesz uzyskać dostęp do danych za pośrednictwem obiektu:
drukuj (wynik [0]. kolor)
To drukuje kolor “srebro”, ponieważ ten rekord jest pierwszym wierszem. Jeśli chcesz, możesz zapętlić obiekt wynikowy.
Po zdefiniowaniu relacji w modelu można uzyskać dostęp do danych w powiązanych tabelach bez określania łączenia:
wynik = session.query (CarOwners) .all () print (wynik [0] .name) print (wynik [0] .car.color)
Działa to, ponieważ model zawiera szczegóły dotyczące struktury tabeli oraz samochód atrybut został zdefiniowany jako link do samochody stół.
Czego nie lubić w ORM?
Ten samouczek obejmował tylko podstawowe zagadnienia, ale kiedy już je zrozumiesz, możesz przejść do zaawansowanych tematów. Istnieje kilka potencjalnych wad ORM:
- Musisz napisać swój model, zanim będzie można uruchomić zapytania.
- To kolejna nowa składnia do nauczenia się.
- Może być zbyt skomplikowany dla prostych potrzeb.
- Na początek musisz mieć dobry projekt bazy danych.
Te problemy same w sobie nie są dużym problemem, ale należy na nie uważać. Jeśli pracujesz z istniejącą bazą danych, możesz zostać złapany.
Jeśli nie jesteś przekonany, że ORM jest właściwym narzędziem dla Ciebie, upewnij się, że przeczytałeś o ważnych poleceniach SQL, programiści powinni znać 13 Najważniejsze polecenia SQL, które powinien znać każdy programista 13 Najważniejsze polecenia SQL, które powinien znać każdy programista Każdy duży lub dynamiczny strona internetowa w jakiś sposób korzysta z bazy danych, a w połączeniu z Structured Query Language (SQL) możliwości manipulowania danymi są naprawdę nieograniczone. .