Podstawy SQLAlchemy

Logo SQLAlchemyW niniejszym wpisie postaram się wyjaśnić działanie SQLAlchemy oraz pokazać jego działanie na paru bardzo prostych przykładach.
Czym jest SQLAlchemy?
SQLAlchemy jest to zespół narzędzi do pracy z bazami danych i Pythonem. Składa się on z Narzędzi SQL i Mappera Obiektowo Relacyjnego. W poniższym wpisie będę starał wytłumaczyć zasady działania Mappera Obiektowo Relacyjnego.
Czym jest Mapper Obiektowo Relacyjny(ORM– Object Relational Mapper)?
ORM jest to narzędzie pozwalające na operowanie na relacyjnych bazach danych bez większej znajomości języka SQL. Zapytania SQL do bazy tworzone są automatycznie na podstawie metod czy funkcji których się używa. Jest to bardzo wygodne narzędzie do szybkiego tworzenia bazy danych oraz jej zarządzania. SQLAlchemy jest niezależny od bazy i pozwala operawać na między innymi:
– DB2
Firebird
– Microsoft SQL Server
MySQL
– Oracle
PostgreSQL
SQLite
– Sybase ASE
Jeżeli nie masz zainstalowanego SQLAlchemy polecam instalację przez:

easy_install sqlalchemy

lub

pip install sqlalchemy

Załóżmy na początęk, że chcę stworzyć tabele Książek i Autorów.
Stwórzmy plik database.py

from sqlalchemy import Integer, Column, String, ForeignKey, Date
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine

Base = declarative_base()

class Book(Base):
    __tablename__ = 'book'

    id = Column(Integer, primary_key=True)
    title = Column(String(20))
    data_publish = Column(Date)
    def __init__(self, title, data_publish):
        self.title = title
        self.data_publish = data_publish
    def __repr__(self):
        return "Title: %s" % (self.title)

class Author(Base):
    __tablename__ = 'author'

    id = Column(Integer, primary_key=True)
    first_name = Column(String(10))
    last_name = Column(String(10))
    def __init__(self, first, last):
        self.first_name = first
        self.last_name = last
    def __repr__(self):
        return "User: %s %s " % (self.first_name, self.last_name)

def make_engine():
    engine = create_engine('sqlite:///bazka.sql')
    return engine

Stwórzmy plik create.py

from database import Base, make_engine

def create_database():
    Base.metadata.bind = make_engine()
    Base.metadata.create_all()

create_database()

I wykonaj:

python create.py

Dzięki temu utworzysz podstawową strukturę Bazy Danych w pliku bazka.sql

Teraz trochę wytłumaczenia kodu:

from sqlalchemy import Integer, Column, String, ForeignKey, Date
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine

Importujemy klasy Column oraz typów danych w bazie(Integer, String, Date, ForeignKey(obecnie jeszcze nie użyte).

Pewnie zastanawiacie się czym jest declarative_base otóż według dokumentacji jest to konstruktor klasy bazowej do definiowania reszty klas.

Base = declarative_base()

Definiowanie klasy bazowej

Tworzenie klasy Book(książek):

class Book(Base):

nazwa tabeli w bazie danych:

__tablename__ = ‘book’

I dalej deklaracje kolejnych kolumn

Pole id powinno mieć wpisane w Column poza typem, również primary_key=True aby było indeksem danej tabeli.

Utworzyłem sobie jedną pomocniczą funkcje make_engine która tworzy mi połączenie z bazą danych do jej utworzenia.

def __init__(self, first, last):

    self.first_name = first
    self.last_name = last

def __repr__(self) – funkcja ta służy do reprezentowania obiektów z bazy typu Book w pythonie.

W pliku create.py mamy

importowanie z pliku data.py Base oraz funkcji make_engine()

Funkcja create_database() binduje połączenie z bazą danych zadeklarowana w make_engine() i tworzy strukturę bazy danych. Domyślnie sprawdza czy taka struktura już istnieje, jeżeli tak to nie robi nic. Jeżeli jej nie ma to tworzy strukturę bazy danych.

Advertisements