SQLAlchemy er et SQL-værktøj bygget med Python, der giver udviklere en overflod af kraftfulde funktioner til at designe og administrere højtydende databaser.
Vi vil kort undersøge, hvordan man bruger SQLAlchemy og derefter dykke dybere ned i, hvordan man udfører rå SQL-sætninger fra Python-domænesprogets komfort.
Brug af SQLAlchemy
Som med alle Python-biblioteker, start med at installere SQLAlchemy. Når det er installeret, kan vi begynde det sjove i Python.
Importer derefter sqlalchemy
selv, så importer et par moduler, så vi nemt kan få adgang til SQLAlchemy-databasemotoren:
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy import inspect
Ud over create_engine
, importerer vi også en række ekstra moduler, som vi skal bruge for at oprette en ny tabel. Før vi kommer til det, skal du sørge for, at SQLAlchemy er installeret, importeret og fungerer ved at kalde .__version__
sådan:
print sqlalchemy.__version__
Out[*]: 1.0.9
Oprettelse af en tabel
Vi vil bruge den grundlæggende funktionalitet i SQLAlchemy, som er SQL Expression Language, til at skabe nogle metadata
der vil indeholde et antal relaterede moduler (eller objekter), der definerer vores nye book
database tabel:
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)
Øverst definerer vi metadata
, så sender vi det ind i Table()
metode, hvor vi giver vores tabel navnet book
. Inden for denne definerer vi hver kolonne sammen med vigtige attributter som datatype og primary_key
.
Når vores tabell(er) er defineret og knyttet til vores metadata
objekt, skal vi oprette en databasemotor, som vi kan oprette forbindelse til. Dette opnås ved hjælp af create_engine
funktion.
engine = create_engine('sqlite:///bookstore.db')
For vores eksempel vil vi bruge en simpel SQLite
database. Du kan også bruge forbindelsesstrenge til andre motorer såsom MySQL eller PostgreSQL. Her er et eksempel på syntaks til at oprette en motor til PostgreSQL:
engine = create_engine('postgresql://user:password@host/database')
Med motoren oprettet, skal vi nu bruge .create_all()
metode til vores metadata
objekt og send engine
forbindelse til det, hvilket automatisk vil få SQLAlchemy til at generere vores tabel for os, som det ses ovenfor.
Når det er færdigt, kan vi bruge bordet, som det passer os. I dette simple eksempel bruger vi bare inspect
modul for at se kolonnerne og bekræfte, at vores tabel blev oprettet:
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()}]
Sikkert nok ved at bruge .get_columns()
metode til vores book
tabel, ser vi, at vores tre kolonner blev genereret.
Udførelse af SQL-sætninger
Med det grundlæggende på plads kan vi nu prøve at udføre noget rå SQL ved hjælp af SQLAlchemy.
Brug af tekstmodulet
En metode til at udføre rå SQL er at bruge text
modul eller Textual SQL
. Den mest læsbare måde at bruge text
på er at importere modulet, derefter efter tilslutning til engine
, definer text
SQL-sætningsstreng før brug af .execute
for at køre det:
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)
Her indsætter vi to poster i vores database ved at bruge en text()
-defineret erklæring.
Brug af udførelsesmetoden
Den alternative metode er at springe over med text()
og send en rå SQL-streng til .execute()
metode. For eksempel vil vi her bruge .execute()
for at se de nye optegnelser, vi indsatte ovenfor:
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')
Der har vi det! Enkle og effektive metoder til at udføre rå SQL-sætninger i SQLAlchemy.