
Edmund Richardson
0
2780
800
Možná jste slyšeli o objektově relačním mapování (ORM). Možná jste ji dokonce použili, ale co přesně 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 to ORM?
Objektově relační mapování (ORM) je programovací technika používaná pro přístup k databázi. Vystavuje 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 může vám ušetřit spoustu času a pomůže řídit přístup k vaší databázi.
Zde je příklad. Řekněme, že pokaždé, když do své databáze vložíte heslo, které chcete hash, jak je vysvětleno v zabezpečení hesla na webu Každý zabezpečený web to dělá se svým heslem Každý zabezpečený web to dělá se svým heslem Už jste někdy přemýšleli, jak webové stránky chrání vaše heslo před daty porušení? . Pro případy jednoduchého 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 mnoho míst v kódu? Co když do vašeho stolu vloží jiný programátor, o kterém nevíte?
Pomocí ORM můžete napsat kód, abyste se ujistili, že kdykoli a kdekoli je přístup k libovolnému řádku nebo poli v databázi, váš druhý vlastní uživatelský kód je nejprve spuštěn.
To 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 v několika. Mnoho z těchto principů je možné provádět pomocí objektově orientovaného programování (OOP) v Pythonu Příručka pro začátečníky k objektově orientovanému programování v Pythonu Příručka pro začátečníky k objektově orientovanému programování v Pythonu Chcete-li plně využít předností Pythonu, musíte se naučit, jak Python pracuje s objektově orientovaným programováním (OOP). , ale ORM spolupracují s principy OOP pro řízení přístupu k databázi.
Při používání systému ORM je třeba dávat pozor, a za určitých okolností je pravděpodobně nebudete chtít použít, ale obecně se považuje za dobrou věc, zejména ve velké kódové základně.
ORM v Pythonu pomocí SQLAlchemy
Stejně jako mnoho úkolů v Pythonu, je rychlejší a snadnější importovat modul než psát vlastní. Samozřejmě je možné napsat vlastní ORM, ale proč znovu vynalézat kolo?
Následující příklady používají SQLAlchemy, populární Python ORM, ale mnoho principů platí bez ohledu na implementaci.
Nastavení Pythonu pro SQLAlchemy
Předtím, než skočíte přímo do, budete muset nastavit stroj pro vývoj Pythonu pomocí SQLAlchemy.
Budete muset použít Python 3.6, abyste postupovali společně s těmito příklady. Zatímco starší verze budou fungovat, níže uvedený kód bude před spuštěním vyžadovat nějakou úpravu. Nejste si jisti rozdíly? Náš Python FAQ Nejčastější dotazy týkající se programování Pythonu Nejčastější dotazy týkající se programování Python V tomto článku vám ukážeme vše, co potřebujete vědět o Pythonu jako začátečník. pokrývá všechny rozdíly.
Před kódováním byste měli nastavit prostředí Python Naučit se používat virtuální prostředí Python Naučit se používat virtuální prostředí Python Ať už jste zkušený vývojář Pythonu, nebo právě začínáte, naučit se, jak nastavit virtuální prostředí, je zásadní pro jakýkoli projekt Python. , což zabrání problémům s jinými importovanými balíčky Pythonu.
Ujistěte se, že máte PIP, správce balíčků Python Jak nainstalovat Python PIP na Windows, Mac a Linux Jak nainstalovat Python PIP na Windows, Mac a Linux Mnoho vývojářů Python spoléhá na nástroj s názvem PIP pro Python, který vše usnadňuje a rychlejší. Zde je návod, jak nainstalovat Python PIP. nainstalován, který je dodáván s nejmodernějšími verzemi Pythonu.
Jakmile budete připraveni jít, můžete začít připravením SQLAlchemy. Z prostředí Pythonu v příkazovém řádku nainstalujte SQLAlchemy pomocí instalace pip příkaz:
pip install SQLAlchemy-1.2.9
1.2.9 je číslo verze. Můžete nechat tuto možnost, abyste získali nejnovější balíček, ale je dobré být konkrétní. Nevíte, kdy nové vydání může porušit váš aktuální kód.
Nyní jste připraveni začít kódovat. Možná budete muset připravit databázi, aby akceptovala připojení Python, ale následující příklady používají databázi SQLite vytvořenou v paměti níže.
Modely v SQLAlchemy
Jednou z klíčových součástí ORM je Modelka. Toto je třída Python, která nastiňuje, jak by tabulka měla vypadat a jak by měla fungovat. Je to ORM verze VYTVOŘENÍ TABULKY příkaz v SQL. Potřebujete model pro každou tabulku v databázi.
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 announrative_base Base = announrative_base () engine = create_engine ('sqlite: //') # Vytvoření databáze v paměti Base.metadata.create_all (engine) # Vytvoření všech tabulek v databázi
Tento kód dělá několik věcí. Import je nezbytný, aby Python pochopil, kde najít moduly SQLAlchemy, které potřebuje. Vaše modely budou používat deklarativní_base později a konfiguruje všechny nové modely tak, aby fungovaly podle očekávání.
create_engine metoda vytvoří nové připojení k vaší databázi. Pokud již máte databázi, budete muset změnit sqlite: // do URI vaší databáze. Tento kód tak vytvoří novou databázi pouze v paměti. Jakmile bude kód dokončen, databáze bude zničena.
Konečně, create_all metoda vytvoří všechny tabulky definované ve vašich režimech v databázi. Protože jste zatím žádné modely nedefinovali, nestane se nic. Pokračujte a spusťte tento kód, abyste se ujistili, že nemáte žádné problémy ani překlepy.
Udělejme model. Přidejte další import do horní části souboru:
z importu sloupců, celých čísel, řetězců
Tím se importuje Sloupec, Celé číslo, a Řetězec moduly od SQLAlchemy. Definují, jak fungují databázové tabulky, pole, sloupce a datové typy.
Pod deklarativní_base, vytvořte svou modelovou třídu:
class Cars (Base): __tablename__ = 'cars' id = Column (Integer, primární_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í zdědit Báze. Název vaší databázové tabulky je definován v __tablename__. Mělo by to být stejné jako jméno třídy, ale je to pouze doporučení a pokud se neshodují, nic se nezlomí.
Nakonec je každý sloupec definován jako pythonová proměnná v rámci třídy. Používají se různé typy dat a primární klíč atribut říká SQLAlchemy, aby vytvořil id sloupec jako primární klíč.
Pokračujte a přidejte jeden poslední import, tentokrát pro Cizí klíč modul. Přidejte toto vedle svého Sloupec import:
z importu sloupců sqlalchemy Column, ForeignKey, Integer, String
Nyní vytvořte druhou třídu modelu. Tato třída se nazývá CarOwners, a ukládá podrobnosti o majitelích konkrétních automobilů uložených na internetu Auta stůl:
class CarOwners (Base): __tablename__ = 'carowners' id = Column (Integer, primární_key = True) name = Column (String (50), nullable = False) age = Column (Integer, nullable = False) car_id = Column (Integer, Integer, ForeignKey ('cars.id')) car = relationship (Cars)
Zde je uvedeno několik nových atributů. car_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 tabulky malých písmen na základě názvu třídy velkých písmen.
Nakonec atribut auto je definován jako a vztah. To umožňuje vašemu modelu přístup k internetu Auta tabulky prostřednictvím této proměnné. To je demonstrováno níže.
Pokud nyní spustíte tento kód, uvidíte, že se nic neděje. Je to proto, že jste mu neřekli, aby udělal ještě něco, co je znatelné.
Objekty v SQLAlchemy
Po vytvoření modelů můžete začít přistupovat k objektům a číst a zapisovat data. Je dobré umístit vaši logiku do své vlastní třídy a souboru, ale prozatím to může zůstat vedle modelů.
Zápis dat
V tomto příkladu musíte do databáze vložit některá data, než si je budete moci přečíst. Pokud používáte existující databázi, možná již máte data. V každém případě je stále velmi užitečné vědět, jak vkládat data.
Můžete být zvyklí psát VLOŽIT příkazy v SQL. SQLAlchemy to zvládne za vás. Zde je návod, jak vložit jeden řádek do Auta Modelka. Začněte s novým importem pro sessionmaker:
od sqlalchemy.orm importu sessionmaker
To je nutné k vytvoření zasedání a DBSession objekty, které se používají ke čtení a zápisu dat:
DBSession = sessionmaker (bind = engine) session = DBSession ()
Teď to dejte pod své create_all prohlášení:
car1 = Cars (make = "Ford", color = "silver") session.add (car1) session.commit ()
Pojďme rozebrat ten kód. Proměnná car1 je definován jako objekt založený na Auta Modelka. Jeho parametry a barva jsou nastaveny jako parametry. To je jako říkat “Udělejte mi auto, ale do databáze ho ještě nezapisujte”. Toto auto existuje v paměti, ale čeká na jeho zapsání.
Přidejte auto do relace s session.add, a poté jej zapište do databáze session.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ěř totožný s předchozím vložením pro Auta Modelka. Hlavní rozdíl je v tom car_id je cizí klíč, takže potřebuje ID řádku, které existuje v druhé tabulce. To je přístupné prostřednictvím internetu car1.id vlastnictví.
Nemusíte dotazovat databázi ani vracet žádná ID, protože SQLAlchemy to za vás zvládne (pokud data odevzdáte jako první).
Čtení dat
Jakmile napíšete některá data, můžete je začít číst zpět. Zde je návod, jak dotazovat Auta a CarOwners tabulky:
result = session.query (Cars) .all ()
Je to tak jednoduché. Pomocí dotaz metoda nalezená v zasedání, určete model a poté použijte Všechno metoda k získání všech výsledků. Pokud víte, že bude pouze jeden výsledek, můžete použít První metoda:
result = session.query (Cars) .first ()
Po dotazu na model a uložení vrácených výsledků do proměnné získáte přístup k datům prostřednictvím objektu:
tisk (výsledek [0] .barva)
Tím se vytiskne barva “stříbrný”, protože tento záznam je první řádek. Pokud chcete, můžete výsledný objekt opakovat.
Jak jste definovali vztah ve vašem 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)
Funguje to proto, že váš model obsahuje podrobnosti o struktuře tabulky a auto Atribut byl definován jako odkaz na auta stůl.
Co se na ORM nelíbí?
Tento tutoriál se týkal pouze samotných základů, ale jakmile se na nich dostanete, můžete přejít k pokročilým tématům. Existují některé potenciální nevýhody ORM:
- Před spuštěním jakýchkoli dotazů musíte napsat svůj model.
- Učit se je další nová syntaxe.
- Pro jednoduché potřeby to může být příliš složité.
- Nejprve musíte mít dobrý návrh databáze.
Tyto problémy nejsou samy o sobě velkým problémem, ale jsou to věci, na které je třeba dát pozor. Pokud pracujete s existující databází, můžete být chyceni.
Pokud si nejste jisti, že ORM je pro vás tím pravým nástrojem, přečtěte si o důležitých příkazech SQL, které by měli programátoři znát 13 nejdůležitějších příkazů SQL, které by měl každý programátor znát web nějakým způsobem používá databázi a ve spojení s Structured Query Language (SQL) jsou možnosti manipulace s daty opravdu nekonečné. .