Vše, co potřebujete vědět o Pythonu a objektově závislých mapách

Vše, co potřebujete vědět o Pythonu a objektově závislých mapách

Možná jste slyšeli o objektově-relačním mapování (ORM). Možná jste dokonce použili jeden, ale jaké to vlastně jsou? A jak je používáte v Pythonu?





Zde je vše, co potřebujete vědět o ORM a Pythonu.





Co je ORM?

Objektově relační mapování (ORM) je programovací technika používaná pro přístup k databázi. Zpřístupňuje vaši databázi do řady objektů. Pro vkládání nebo načítání dat nemusíte psát příkazy SQL, používáte řadu atributů a metod připojených k objektům.





Může to znít složitě a zbytečně, ale mohou vám ušetřit spoustu času a pomoci řídit přístup k vaší databázi.

Zde je příklad. Řekněme, že kdykoli vložíte heslo do databáze, chcete jej zahašovat, jak je vysvětleno v zabezpečení heslem webových stránek. Pro jednoduché případy použití to není problém-výpočet provedete před vložením. Ale co když potřebujete vložit záznam na mnoha místech v kódu? Co když do vaší tabulky vloží jiný programátor a vy o tom nevíte?



Pomocí ORM můžete napsat kód, abyste zajistili, že kdykoli a kdekoli se přistoupí k libovolnému řádku nebo poli ve vaší databázi, nejprve se spustí váš jiný, vlastní kód.

Toto také funguje jako „jediný zdroj pravdy“. Pokud chcete změnit vlastní výpočet, musíte jej změnit pouze na jednom místě, nikoli na několika. Mnoho z těchto principů je možné provádět pomocí objektově orientované programování (OOP) v Pythonu , ale ORM pracují společně s principy OOP pro řízení přístupu k databázi.





Při používání ORM je třeba dávat pozor na určité věci a existují okolnosti, kdy je možná nebudete chtít použít, ale obecně jsou považovány za dobré, zejména ve velké základně kódů.

ORM v Pythonu pomocí SQLAlchemy

Stejně jako mnoho úkolů v Pythonu je import modulu rychlejší a snazší než psaní vlastního. Samozřejmě je možné napsat vlastní ORM, ale proč znovu objevovat kolo?





Následující příklady všechny používají SQLAlchemy , populární Python ORM, ale mnoho zásad platí bez ohledu na implementaci.

Nastavení Pythonu pro SQLAlchemy

Než skočíte přímo dovnitř, budete muset nastavit svůj počítač pro vývoj v Pythonu pomocí SQLAlchemy.

K provedení těchto příkladů budete muset použít Python 3.6. Zatímco starší verze budou fungovat, níže uvedený kód bude před spuštěním potřebovat nějaké úpravy. Nejste si jisti rozdíly? Náš Python FAQ pokrývá všechny rozdíly.

Před kódováním byste měli nastavit prostředí Pythonu, které zabrání problémům s jinými importovanými balíčky Pythonu.

Ujistěte se, že máte PIP, správce balíčků Pythonu nainstalován, který je dodáván s většinou moderních verzí Pythonu.

Jakmile budete připraveni, můžete začít tím, že se připravíte na SQLAlchemy. Z vašeho prostředí Pythonu na příkazovém řádku nainstalujte SQLAlchemy pomocí pip install příkaz:

pip install SQLAlchemy-1.2.9

The 1.2.9 je číslo verze. Chcete -li získat nejnovější balíček, můžete to vypnout, ale je dobré být konkrétní. Nevíte, kdy nové vydání může narušit váš aktuální kód.

Nyní jste připraveni začít s kódováním. Možná budete muset připravit svou databázi na přijetí připojení Pythonu, ale všechny následující příklady používají SQLite databáze vytvořená v paměti níže.

Modely v SQLAlchemy

Jednou z klíčových součástí ORM je a Modelka . Toto je třída Pythonu, která popisuje, jak by měla tabulka vypadat a jak by měla fungovat. Je to verze ORM VYTVOŘIT TABULKU příkaz v SQL. Pro každou tabulku ve své databázi potřebujete model.

Otevřete svůj oblíbený textový editor nebo IDE a vytvořte nový soubor s názvem test.py . Zadejte tento startovací kód, uložte soubor a spusťte jej:

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

Tento kód dělá několik věcí. Importy jsou nutné, aby Python rozuměl, kde najít potřebné moduly SQLAlchemy. Vaše modely budou používat deklarativní základna později a nakonfiguruje všechny nové modely tak, aby fungovaly podle očekávání.

The create_engine metoda vytvoří nové připojení k vaší databázi. Pokud již máte databázi, budete ji muset změnit sqlite: // do vašeho URI databáze. Jak to je, tento kód vytvoří novou databázi pouze v paměti. Po dokončení spouštění kódu je databáze zničena.

Nakonec, create_all metoda vytvoří ve vaší databázi všechny tabulky definované ve vašich režimech. Protože jste zatím nedefinovali žádné modely, nic se nestane. Pokračujte a spusťte tento kód, abyste se ujistili, že nemáte žádné problémy nebo překlepy.

Udělejme model. Přidejte další import do horní části souboru:

from sqlalchemy import Column, Integer, String

To importuje soubor Sloupec , Celé číslo , a Tětiva moduly od SQLAlchemy. Definují, jak fungují databázové tabulky, pole, sloupce a datové typy.

Pod deklarativní základna , vytvořte svou modelovou třídu:

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

Tento jednoduchý příklad používá automobily, ale vaše tabulky mohou obsahovat jakákoli data.

Každá třída musí dědit Základna . Název vaší databázové tabulky je definován v __tablename__ . To by mělo být stejné jako název třídy, ale je to jen doporučení a nic se nerozbije, pokud se neshodují.

Nakonec je každý sloupec definován jako proměnná pythonu v rámci třídy. Používají se různé datové typy a primární klíč atribut říká SQLAlchemy, aby vytvořil soubor id sloupec jako primární klíč.

Pokračujte a přidejte poslední import, tentokrát pro Cizí klíč modul. Přidejte toto vedle svého Sloupec import:

from sqlalchemy import Column, ForeignKey, Integer, String

Nyní vytvořte druhou modelovou třídu. Tato třída se nazývá Autoři , a ukládá podrobnosti o majiteli konkrétních vozů uložených v Auta stůl:

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)

Je zde představeno několik nových atributů. The auto_id pole je definováno jako cizí klíč. Je spojen s id v auta stůl. Všimněte si, jak se používá název malé tabulky, místo názvu velké třídy.

Nakonec atribut auto je definován jako a vztah . To umožňuje vašemu modelu přístup k Auta tabulku prostřednictvím této proměnné. To je ukázáno níže.

Pokud tento kód spustíte nyní, uvidíte, že se nic nestane. Důvodem je, že jste tomu ještě neřekli, aby dělal něco viditelného.

Objekty v SQLAlchemy

Nyní, když jsou vaše modely vytvořeny, můžete začít přistupovat k objektům a číst a zapisovat data. Je dobré umístit logiku do vlastní třídy a souboru, ale prozatím může zůstat vedle modelů.

Zápis dat

V tomto příkladu je třeba vložit některá data do databáze, než je budete moci číst. Pokud používáte existující databázi, možná již máte data. Ať tak či onak, je stále velmi užitečné vědět, jak vkládat data.

Možná jste zvyklí psát VLOŽIT příkazy v SQL. SQLAlchemy to vyřeší za vás. Zde je návod, jak vložit jeden řádek do souboru Auta Modelka. Začněte novým importem pro tvůrce relací :

from sqlalchemy.orm import sessionmaker

To je potřeba k vytvoření souboru zasedání a DBSession objekty, které se používají ke čtení a zápisu dat:

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

Nyní to dejte pod své create_all tvrzení:

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

Pojďme rozebrat ten kód. Proměnná auto 1 je definován jako objekt na základě Auta Modelka. Jeho značka a barva jsou nastaveny jako parametry. To je jako říkat 'udělej mi auto, ale zatím to nezapisuj do databáze'. Toto auto existuje v paměti, ale čeká na zápis.

Přidejte auto do relace pomocí session.add , a poté jej zapište do databáze pomocí relace.commit .

Nyní přidáme vlastníka:

owner1 = CarOwners(
name='Joe',
age='99',
car_id=(car1.id)
)
session.add(owner1)
session.commit()

Tento kód je téměř identický s předchozím vložením pro Auta Modelka. Zde je hlavní rozdíl v tom auto_id je cizí klíč, takže potřebuje ID řádku, které existuje v jiné tabulce. To je přístupné přes auto1.id vlastnictví.

Nemusíte dotazovat databázi ani vracet žádná ID, protože SQLAlchemy to vyřeší za vás (pokud data odevzdáte jako první).

Čtení dat

Jakmile napíšete nějaká data, můžete je začít číst zpět. Zde je postup dotazu na soubor Auta a Autoři stoly:

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

Je to tak jednoduché. Pomocí dotaz metoda nalezená v zasedání , určíte model a poté použijete Všechno způsob načtení všech výsledků. Pokud víte, že bude existovat pouze jeden výsledek, můžete použít za prvé metoda:

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

Jakmile dotazujete model a uložíte vrácené výsledky do proměnné, můžete k datům přistupovat prostřednictvím objektu:

print(result[0].color)

Tím se vytiskne barva „stříbrná“, protože tento záznam je první řadou. Pokud chcete, můžete smyčku přes výsledný objekt.

Jak jste definovali vztah ve svém modelu, je možné přistupovat k datům v souvisejících tabulkách bez zadání spojení:

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

To funguje, protože váš model obsahuje podrobnosti o struktuře tabulky a auto atribut byl definován jako odkaz na soubor auta stůl.

Co se vám na ORM nelíbí?

Tento tutoriál se zabýval pouze základy, ale jakmile se s nimi seznámíte, můžete přejít na pokročilá témata. Existují určité potenciální nevýhody ORM:

  • Před spuštěním jakýchkoli dotazů musíte napsat svůj model.
  • Je to další nová syntaxe, kterou se musíte naučit.
  • Na jednoduché potřeby to může být příliš složité.
  • Pro začátek musíte mít dobrý návrh databáze.

Tyto problémy samy o sobě nejsou velkým problémem, ale je třeba si na ně dát pozor. Pokud pracujete s existující databází, můžete být chyceni.

Pokud nejste přesvědčeni, že ORM je pro vás ten správný nástroj, přečtěte si o něm důležité příkazy SQL by programátoři měli vědět .

Podíl Podíl tweet E-mailem Měli byste okamžitě upgradovat na Windows 11?

Windows 11 již brzy přichází, ale měli byste aktualizovat co nejdříve nebo počkat několik týdnů? Pojďme to zjistit.

Číst dále
Související témata
  • Programování
  • Krajta
  • SQL
  • Návody na kódování
O autorovi Joe Coburn(136 publikovaných článků)

Joe je absolventem informatiky na University of Lincoln, UK. Je profesionálním vývojářem softwaru, a když zrovna neletí drony nebo nepíše hudbu, často ho lze zastihnout při fotografování nebo produkci videí.

nejjednodušší způsob, jak vytvořit vývojový diagram
Více od Joe Coburn

Přihlaste se k odběru našeho zpravodaje

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné elektronické knihy a exkluzivní nabídky!

Kliknutím sem se přihlásíte k odběru