Wszystko, co musisz wiedzieć o Pythonie i mapach obiektowo-relacyjnych

Wszystko, co musisz wiedzieć o Pythonie i mapach obiektowo-relacyjnych

Być może słyszałeś o mapowaniu obiektowo-relacyjnym (ORM). Być może nawet użyłeś jednego, ale czym one właściwie są? A jak używasz ich w Pythonie?





Oto wszystko, co musisz wiedzieć o ORM-ach i Pythonie.





Co to jest ORM?

Mapowanie obiektowo-relacyjne (ORM) to technika programowania używana do uzyskiwania dostępu do bazy danych. Udostępnia twoją bazę danych w serii obiektów. Nie musisz pisać poleceń SQL, aby wstawić lub pobrać dane, używasz serii atrybutów i metod dołączonych do obiektów.





Może to wydawać się skomplikowane i niepotrzebne, ale może 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 swojej bazy danych, chcesz je zaszyfrować, jak wyjaśniono w temacie Bezpieczeństwo haseł w witrynie . Nie stanowi to problemu dla prostych przypadków użycia --- wykonujesz obliczenia przed wstawieniem. Ale co, jeśli musisz wstawić rekord w wielu miejscach w kodzie? Co się stanie, jeśli inny programista wstawi do twojej tabeli, a ty nic o tym nie wiesz?



Korzystając z ORM, możesz napisać kod, aby upewnić się, że zawsze i wszędzie tam, gdzie jest uzyskiwany dostęp do dowolnego wiersza lub pola w Twojej bazie danych, Twój inny, niestandardowy kod jest wykonywany jako pierwszy.

Działa to również jako „pojedyncze źródło prawdy”. Jeśli chcesz zmienić kalkulację niestandardową, musisz ją zmienić tylko w jednym miejscu, a nie w kilku. Wiele z tych zasad można wykonać za pomocą programowanie obiektowe (OOP) w Pythonie , ale ORM działają w parze z zasadami OOP, aby kontrolować dostęp do bazy danych.





Podczas korzystania z ORM należy zwrócić uwagę na pewne rzeczy i są okoliczności, w których możesz nie chcieć ich używać, ale ogólnie uważa się, że warto je mieć, szczególnie w przypadku dużej bazy kodu.

ORM w Pythonie przy użyciu SQLAlchemy

Jak wiele zadań w Pythonie, zaimportowanie modułu jest szybsze i łatwiejsze niż pisanie własnego. Oczywiście można napisać własny ORM, ale po co wymyślać koło na nowo?





Wszystkie poniższe przykłady używają SQLAlchemia , popularnym ORM w Pythonie, ale wiele zasad ma zastosowanie niezależnie od implementacji.

Konfigurowanie Pythona dla SQLAlchemy

Zanim zaczniesz od razu, będziesz musiał skonfigurować swoją maszynę do programowania w Pythonie za pomocą SQLAlchemy.

Będziesz musiał użyć Pythona 3.6, aby podążać za tymi przykładami. Chociaż starsze wersje będą działać, poniższy kod będzie wymagał pewnych modyfikacji przed uruchomieniem. Nie jesteś pewien różnic? Nasze FAQ dotyczące Pythona obejmuje wszystkie różnice.

Przed przystąpieniem do kodowania powinieneś skonfigurować środowisko Pythona , które zapobiegnie problemom z innymi importowanymi pakietami Pythona.

Upewnij się że masz PIP, menedżer pakietów Pythona zainstalowany, który jest dostarczany z większością nowoczesnych wersji Pythona.

Gdy będziesz gotowy do pracy, możesz zacząć od przygotowania SQLAlchemy. Z poziomu swojego środowiska Python w wierszu poleceń zainstaluj SQLAlchemy za pomocą instalacja pip Komenda:

pip install SQLAlchemy-1.2.9

ten 1.2.9 to numer wersji. Możesz to pominąć, aby uzyskać najnowszy pakiet, ale dobrą praktyką jest bycie konkretnym. Nie wiesz, kiedy nowa wersja może złamać Twój obecny kod.

Teraz możesz zacząć kodować. Być może będziesz musiał przygotować bazę danych do zaakceptowania połączenia w Pythonie, ale wszystkie poniższe przykłady używają an SQLite baza danych utworzona w pamięci poniżej.

Modele w SQLAlchemy

Jednym z kluczowych elementów ORM jest Model . Jest to klasa Pythona, która określa, jak powinna wyglądać tabela i jak powinna działać. Jest to wersja ORM of UTWÓRZ TABELĘ instrukcja w SQL. Potrzebujesz modelu dla każdej tabeli w Twojej bazie danych.

Otwórz swój ulubiony edytor tekstu lub IDE i utwórz nowy plik o nazwie test.py . Wprowadź 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://') # Create the database in memory
Base.metadata.create_all(engine) # Create all the tables in the database

Ten kod robi kilka rzeczy. Importy są niezbędne, aby Python wiedział, gdzie znaleźć potrzebne moduły SQLAlchemy. Twoje modele będą korzystać z deklaratywna_baza później i konfiguruje nowe modele tak, aby działały zgodnie z oczekiwaniami.

ten tworzenie_silnika Metoda tworzy nowe połączenie z bazą danych. Jeśli masz już bazę danych, musisz zmienić sqlite:// do identyfikatora URI bazy danych. W obecnej sytuacji ten kod utworzy nową bazę danych tylko w pamięci. Baza danych jest niszczona po zakończeniu wykonywania kodu.

Wreszcie utwórz_wszystko Metoda tworzy wszystkie tabele zdefiniowane w twoich trybach w twojej bazie danych. Ponieważ nie zdefiniowałeś jeszcze żadnych modeli, nic się nie stanie. Ś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 początku pliku:

from sqlalchemy import Column, Integer, String

To importuje Kolumna , Liczba całkowita , oraz Strunowy moduły z SQLAlchemy. Definiują one sposób działania tabel, pól, kolumn i typów danych bazy danych.

Pod deklaratywna_baza , utwórz klasę modelu:

class Cars(Base):
__tablename__ = 'cars'
id = Column(Integer, primary_key=True)
make = Column(String(50), nullable=False)
color = Column(String(50), nullable=False)

W tym prostym przykładzie użyto samochodów, ale Twoje tabele mogą zawierać dowolne dane.

Każda klasa musi dziedziczyć Baza . Twoja nazwa tabeli bazy danych jest zdefiniowana w __Nazwa tabeli__ . Powinna być taka sama jak nazwa klasy, ale to tylko zalecenie i nic się nie zepsuje, jeśli nie będą pasować.

Wreszcie, każda kolumna jest zdefiniowana jako zmienna Pythona w klasie. Używane są różne typy danych, a główny klucz Atrybut mówi SQLAlchemy o utworzeniu NS kolumna jako klucz podstawowy.

Śmiało i dodaj ostatni import, tym razem dla Klucz obcy moduł. Dodaj to obok swojego Kolumna import:

from sqlalchemy import Column, ForeignKey, Integer, String

Teraz utwórz drugą klasę modelu. Ta klasa nazywa się CarOwners i przechowuje dane właściciela konkretnych samochodów przechowywanych w Samochody Tabela:

class CarOwners(Base):
__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'))
car = relationship(Cars)

Wprowadzono tu kilka nowych atrybutów. ten identyfikator_samochodu pole jest zdefiniowane jako klucz obcy. Jest powiązany z NS w samochody Tabela. Zwróć uwagę, jak używana jest nazwa tabeli pisana małymi literami, zamiast nazwy klasy pisanej wielkimi literami.

Wreszcie atrybut samochód jest zdefiniowany jako relacja . Pozwala to Twojemu modelowi na dostęp do Samochody tabeli poprzez tę zmienną. Pokazano to poniżej.

Jeśli uruchomisz ten kod teraz, zobaczysz, że nic się nie dzieje. Dzieje się tak, ponieważ nie powiedziałeś mu jeszcze, żeby zrobił coś 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ć pewne dane do bazy danych, zanim będziesz mógł je odczytać. Jeśli korzystasz z istniejącej bazy danych, być może masz już dane. Tak czy inaczej, nadal bardzo przydatna jest wiedza, jak wstawiać dane.

Możesz być przyzwyczajony do pisania WSTAWIĆ instrukcje w języku SQL. SQLAlchemy obsługuje to za Ciebie. Oto jak wstawić jeden wiersz do Samochody Model. Zacznij od nowego importu dla sesyjka :

from sqlalchemy.orm import sessionmaker

Jest to potrzebne do stworzenia sesja oraz DBSsesja obiekty, które służą do odczytu i zapisu danych:

DBSession = sessionmaker(bind=engine)
session = DBSession()

Teraz umieść to pod swoim utwórz_wszystko oświadczenie:

car1 = Cars(
make='Ford',
color='silver'
)
session.add(car1)
session.commit()

Złammy ten kod. Zmienna samochód1 jest zdefiniowany jako obiekt oparty na Samochody Model. Jego marka i kolor są ustawione jako parametry. To tak, jakby powiedzieć „zrób mi samochód, ale jeszcze nie zapisuj tego w bazie danych”. Ten samochód istnieje w pamięci, ale czeka na zapisanie.

Dodaj samochód do sesji z sesja.dodaj , a następnie zapisz go do bazy danych za pomocą sesja.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łówną różnicą jest to, że identyfikator_samochodu jest kluczem obcym, więc potrzebuje identyfikatora wiersza, który istnieje w drugiej tabeli. Jest to dostępne przez samochód1.id własność.

Nie musisz wysyłać zapytań do bazy danych ani zwracać żadnych identyfikatorów, ponieważ SQLAlchemy obsługuje to za Ciebie (o ile najpierw zatwierdzisz dane).

Czytanie danych

Po zapisaniu pewnych danych możesz zacząć je ponownie czytać. Oto jak wykonać zapytanie Samochody oraz CarOwners stoły:

result = session.query(Cars).all()

To takie proste. Używając zapytanie metoda znaleziona w sesja , określasz model, a następnie używasz wszystko metodę pobierania wszystkich wyników. Jeśli wiesz, że wynik będzie tylko jeden, możesz użyć pierwszy metoda:

result = session.query(Cars).first()

Po zapytaniu o model i zapisaniu zwróconych wyników w zmiennej, możesz uzyskać dostęp do danych za pośrednictwem obiektu:

print(result[0].color)

To drukuje kolor „srebrny”, ponieważ ten rekord jest pierwszym wierszem. Jeśli chcesz, możesz zapętlić obiekt wynikowy.

Po zdefiniowaniu relacji w modelu możliwy jest dostęp do danych w powiązanych tabelach bez określania sprzężenia:

result = session.query(CarOwners).all()
print(result[0].name)
print(result[0].car.color)

Działa to, ponieważ model zawiera szczegóły struktury tabeli, a samochód atrybut został zdefiniowany jako link do samochody Tabela.

Czego nie lubić w ORM-ach?

Ten samouczek obejmował tylko podstawy, ale gdy już je opanujesz, możesz przejść do zaawansowanych tematów. Istnieją pewne potencjalne wady ORM-ów:

  • Musisz napisać swój model, zanim jakiekolwiek zapytania będą mogły zostać uruchomione.
  • To kolejna nowa składnia do nauczenia.
  • Może być zbyt złożony 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ć przyłapany.

Jeśli nie jesteś przekonany, że ORM jest odpowiednim narzędziem dla Ciebie, koniecznie przeczytaj o tym ważne polecenia SQL, które programiści powinni znać .

Udział Udział Ćwierkać E-mail Czy należy natychmiast uaktualnić do systemu Windows 11?

Windows 11 już wkrótce, ale czy powinieneś aktualizować jak najszybciej, czy poczekać kilka tygodni? Dowiedzmy Się.

Czytaj dalej
Powiązane tematy
  • Programowanie
  • Pyton
  • SQL
  • Poradniki kodowania
O autorze Joe Coburn(136 opublikowanych artykułów)

Joe jest absolwentem informatyki na Uniwersytecie w Lincoln w Wielkiej Brytanii. Jest profesjonalnym programistą, a kiedy nie lata dronami ani nie pisze muzyki, często można go spotkać wykonującego zdjęcia lub produkującego filmy.

jak zrobić zdjęcia w jeden
Więcej od Joe Coburna

Zapisz się do naszego newslettera

Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!

Kliknij tutaj, aby zasubskrybować