SQLAlchemy je nástroj SQL vytvořený v Pythonu, který poskytuje vývojářům množství výkonných funkcí pro navrhování a správu vysoce výkonných databází.
Krátce prozkoumáme, jak používat SQLAlchemy, a poté se ponoříme hlouběji do toho, jak provádět nezpracované příkazy SQL z pohodlí jazyka domény Python.
Použití SQLAlchemy
Stejně jako u všech knihoven Pythonu začněte instalací SQLAlchemy. Po instalaci se můžeme začít bavit v Pythonu.
Dále importujte sqlalchemy
a poté importujte několik modulů, abychom mohli snadno přistupovat k databázovému stroji SQLAlchemy:
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy import inspect
Kromě create_engine
, importujeme také řadu dalších modulů, které budeme potřebovat k vytvoření nové tabulky. Než se k tomu ale dostaneme, zavolejte .__version__
a ujistěte se, že SQLAlchemy byla nainstalována, importována a funguje takhle:
print sqlalchemy.__version__
Out[*]: 1.0.9
Vytvoření tabulky
K vytvoření některých metadata
budeme používat základní funkce SQLAlchemy, což je jazyk SQL Expression Language který bude obsahovat řadu souvisejících modulů (nebo objektů), které definují naši novou book
databázová tabulka:
metadata = MetaData()
books = Table('book', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('primary_author', String),
)
engine = create_engine('sqlite:///bookstore.db')
metadata.create_all(engine)
Nahoře definujeme metadata
, pak to předáme do Table()
metoda, kde naší tabulce dáme název book
. V rámci toho definujeme každý sloupec spolu s důležitými atributy, jako je datový typ a primary_key
.
Jakmile jsou naše tabulky definovány a spojeny s našimi metadata
musíme vytvořit databázový stroj, se kterým se můžeme spojit. Toho lze dosáhnout pomocí create_engine
funkce.
engine = create_engine('sqlite:///bookstore.db')
V našem příkladu budeme používat jednoduchý SQLite
databáze. Můžete také použít připojovací řetězce pro jiné motory, jako je MySQL nebo PostgreSQL. Zde je příklad syntaxe pro vytvoření enginu pro PostgreSQL:
engine = create_engine('postgresql://user:password@host/database')
S vytvořeným enginem nyní musíme použít .create_all()
metoda našich metadata
objekt a předejte engine
připojení k němu, což automaticky způsobí, že SQLAlchemy za nás vygeneruje naši tabulku, jak je vidět výše.
Po dokončení můžeme tabulku používat, jak uznáme za vhodné. V tomto jednoduchém příkladu použijeme pouze inspect
modul pro zobrazení sloupců a ověření, že naše tabulka byla úspěšně vytvořena:
inspector = inspect(engine)
inspector.get_columns('book')
Out[*]:
[{'autoincrement': True,
'default': None,
'name': u'id',
'nullable': False,
'primary_key': 1,
'type': INTEGER()},
{'autoincrement': True,
'default': None,
'name': u'title',
'nullable': True,
'primary_key': 0,
'type': VARCHAR()},
{'autoincrement': True,
'default': None,
'name': u'primary_author',
'nullable': True,
'primary_key': 0,
'type': VARCHAR()}]
Samozřejmě pomocí .get_columns()
metodu pro naši book
tabulky, vidíme, že byly vygenerovány naše tři sloupce.
Provádění příkazů SQL
Se základy na místě se nyní můžeme pokusit provést nějaké nezpracované SQL pomocí SQLAlchemy.
Použití textového modulu
Jednou z metod pro provádění nezpracovaných SQL je použití text
modul nebo Textual SQL
. Nejčitelnější způsob použití text
je importovat modul a poté po připojení k engine
, definujte text
Řetězec příkazu SQL před použitím .execute
spustit:
from sqlalchemy.sql import text
with engine.connect() as con:
data = ( { "id": 1, "title": "The Hobbit", "primary_author": "Tolkien" },
{ "id": 2, "title": "The Silmarillion", "primary_author": "Tolkien" },
)
statement = text("""INSERT INTO book(id, title, primary_author) VALUES(:id, :title, :primary_author)""")
for line in data:
con.execute(statement, **line)
Zde vkládáme dva záznamy do naší databáze pomocí text()
-definovaný příkaz.
Použití metody spuštění
Alternativní metodou je přeskočit pomocí text()
a předejte nezpracovaný řetězec SQL do .execute()
metoda. Například zde použijeme .execute()
pro zobrazení nových záznamů, které jsme vložili výše:
with engine.connect() as con:
rs = con.execute('SELECT * FROM book')
for row in rs:
print row
Out[*]:
(4, u'The Hobbit', u'Tolkien')
(5, u'The Silmarillion', u'Tolkien')
Tady to máme! Jednoduché a efektivní metody pro provádění nezpracovaných příkazů SQL v SQLAlchemy.