
SQLAlchemy - najważniejsze informacje i podstawowa konfiguracja
SQLAlchemy to popularna biblioteka Pythona służąca do obsługi baz danych. W artykule przedstawione zostaną najważniejsze informacje na temat SQLAlchemy oraz podstawowa konfiguracja, które pomogą programistom efektywnie korzystać z tej biblioteki. Czytelnik dowie się, jak zainstalować SQLAlchemy, jak skonfigurować połączenie z bazą danych oraz pozna podstawowe metody manipulacji danymi.
CEO
03 lip 2023
SQLAlchemy to popularne narzędzie służące do mapowania obiektowo-relacyjnego (ORM) w języku Python. Jest ono powszechnie używane w projektach mających do czynienia z bazami danych typu SQL. SQLAlchemy zapewnia intuicyjny interfejs do tworzenia i zarządzania tabelami, relacjami oraz zapytaniami do bazy danych. Dzięki temu programiści mogą skupić się na implementacji logiki biznesowej, zamiast na bezpośrednim korzystaniu z języka SQL. Podstawowa konfiguracja SQLAlchemy obejmuje określenie połączenia do bazy danych oraz zdefiniowanie modeli obiektów mapowanych na tabele.
Powiązane case studies


Platforma edukacyjna generująca materiały do nauki programowania z ChatGPT
Klient: Klient (Aplikacja webowa do nauki programowania)
Branża: Edukacja / EdTech

Dr Marcus - strona internetowa z katalogiem produktów
Klient: Dr Marcus
Branża: Motoryzacja / Mobility
Instalacja i konfiguracja SQLAlchemy
Instalacja i konfiguracja SQLAlchemy to niezwykle prosta i szybka procedura. Aby rozpocząć, należy najpierw zainstalować SQLAlchemy za pomocą menadżera pakietów, takiego jak pip.
pip install SQLAlchemy
Po zainstalowaniu, możemy go zaimportować do naszego projektu Pythona. Pakiet jest dostępny pod nazwą sqlalchemy. Następnie należy skonfigurować połączenie do bazy danych, wykorzystując odpowiednie dane takie jak nazwa bazy danych, użytkownik, hasło, host i port. Składnia to:
from sqlalchemy import create_engine
engine = create_engine(
"<dialekt>+<driver>://<użytkownik>:<hasło>@<host>:<port>/<baza danych>"
)
Dostępne dialekty to mysql, postgresql, oracle, mssql i sqlite. Driver to API używane do komunikacji z bazą. Może być to na przykład mysqlconnector dla MySQL lub psycopg2 dla PostgreSQL. Do funkcji create_engine możemy przekazać też argument nazwany echo z wartością True, aby logować do konsoli wykonywane zapytania SQL.
Deklarowanie modeli
Na początek powinniśmy zdefiniować modele. Zgodnie z dokumentacją SQLAlchemy powinniśmy utworzyć klasę bazową, a następnie klasy modeli, które po niej dziedziczą. Wygląda to w ten sposób:
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
Klasę Base możemy rozwinąć o dodatkowe funkcjonalności, jak customowa metoda dict(), aby ułatwić konwertowanie obiektów bazy danych do słowników. SQLAlchemy posiada wsparcie dla modułu typing, dzięki czemu tworzenie modeli wygląda w ten sposób:
from typing import Optional
from sqlalchemy import String
from sqlalchemy.orm import Mapped, mapped_column
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True)
email: Mapped[Optional[str]]
username: Mapped[str] = mapped_column(String(30))
Funkcja mapped_column służy do deklarowania kolumny w tabeli bazy danych. Jeśli używamy Mapped jako adnotacji typu, to mapped_column jest potrzebny tylko do doprecyzowania cech kolumny takich jak maksymalna długość, czy klucz główny. Tabele tworzymy za pomocą metody Base.metadata.create_all(), przekazując nasz utworzony engine jako argument.
Relacje
Relacje tworzymy dokładnie tak jak pola, tylko używamy funkcji relationship. Co ciekawe, jeśli chcemy, aby nasza relacja działała w obie strony, musimy ją zdefiniować również na dwóch obiektach (inaczej, niż na przykład w Django ORM). Wygląda to tak:
from typing import List
from sqlalchemy.orm import relationship, Mapped, mapped_column
from sqlalchemy import ForeignKey
class Article(Base):
id: Mapped[int] = mapped_column(primary_key=True)
author_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
author: Mapped["User"] = relationship("User", back_populates="articles")
class User(Base):
...
articles: Mapped[List["Article"]] = relationship(back_populates="author")
CRUD
Crud natomiast nie jest już tak intuicyjny. Trzeba zaimportować engine i utworzyć sesję. W tym snippecie kodu utworzymy User'a, zaktualizujemy go, wyciągniemy z bazy, a następnie usuniemy.
from sqlalchemy.orm import Session
from sqlalchemy import select
with Session(engine) as session:
# CREATE
user1 = User(email="[email protected]", username="Example")
session.add(user1)
session.commit()
# RETRIEVE and UPDATE
selected_user1 = session.scalars(select(User)).where(User.email == "[email protected]").one()
selected_user1.username = "Example updated"
session.commit()
# DELETE
session.delete(selected_user1)
session.commit()
SQLAlchemy to rozbudowana biblioteka, która oferuje o wiele więcej funkcjonalności, niż te opisane w artykule. W razie wątpliwości zawsze warto zerknąć do dokumentacji, dostępnej na oficjalnej stronie SQLAlchemy.
Źródło: https://docs.sqlalchemy.org
FAQ
FAQ – najczęstsze pytania dotyczące SQLAlchemy
SQLAlchemy to biblioteka Pythona do mapowania obiektowo-relacyjnego (ORM) i wykonywania zapytań na bazach danych SQL. Pozwala definiować tabele i relacje jako klasy Pythona, operować na nich jak na zwykłych obiektach i automatycznie generuje pod spodem SQL. Wspiera wiele dialektów — PostgreSQL, MySQL, SQLite, Oracle, MS SQL Server. Programista koncentruje się na logice biznesowej zamiast pisać surowe zapytania. SQLAlchemy to praktycznie standardowy wybór ORM w Pythonie obok Django ORM.
Instalacja przez pip: `pip install SQLAlchemy`. Konfiguracja wymaga utworzenia obiektu `engine` z connection string w formacie `+://:@:/`. Przykład: `create_engine("postgresql+psycopg2://user:pass@localhost:5432/mydb")`. Dostępne dialekty to mysql, postgresql, oracle, mssql, sqlite. Driver to API komunikacji z bazą — `mysqlconnector` dla MySQL, `psycopg2` dla PostgreSQL. Argument `echo=True` przy `create_engine` loguje wykonywane zapytania, co bardzo pomaga przy debugowaniu.
W nowoczesnej wersji 2.0 dziedziczy się po `DeclarativeBase` z modułu `sqlalchemy.orm`. Każdy model to klasa z atrybutem `__tablename__` i polami zadeklarowanymi przez `Mapped[type]` plus `mapped_column()`. Przykład: `id: Mapped[int] = mapped_column(primary_key=True)`, `username: Mapped[str] = mapped_column(String(30))`, `email: Mapped[Optional[str]]`. Adnotacje typu Mapped są opcjonalne, ale dają type-safety w IDE i podczas runtime'u. Tabele tworzy się przez `Base.metadata.create_all(engine)` — operacja idempotentna.
Relacje deklaruje się przez `relationship()` z modułu `sqlalchemy.orm`, połączone kluczem obcym (`ForeignKey`). Ważna różnica vs Django ORM: jeśli chcesz relację dwukierunkową, **musisz** zdefiniować ją na obu obiektach z parametrem `back_populates`. Przykład: w `Article` masz `author: Mapped["User"] = relationship(back_populates="articles")`, a w `User` odwrotnie `articles: Mapped[List["Article"]] = relationship(back_populates="author")`. Bez tego relacja działa tylko jednostronnie. SQLAlchemy obsługuje wszystkie typy relacji: one-to-many, many-to-many, self-referential.
CRUD wymaga obiektu sesji (`Session`) — kontekst, w którym śledzone są zmiany. **Create**: `session.add(obj); session.commit()`. **Read**: `session.scalars(select(User)).where(User.email == "x@y").one()` — używasz funkcji `select()` zamiast surowego SQL. **Update**: zmień atrybut na obiekcie z bazy, `session.commit()` automatycznie wygeneruje UPDATE. **Delete**: `session.delete(obj); session.commit()`. Sesję najlepiej używać jako context manager: `with Session(engine) as session: ...` — gwarantuje poprawne zamknięcie i rollback przy wyjątku.
Cztery główne różnice. **Niezależność**: SQLAlchemy działa w dowolnym projekcie Pythona, Django ORM jest częścią Django. **Filozofia**: SQLAlchemy oferuje dwa poziomy — Core (niski, blisko SQL) i ORM (wysoki); Django ORM tylko ORM. **Relacje dwukierunkowe**: SQLAlchemy wymaga jawnej deklaracji na obu modelach, Django robi to automatycznie. **Migracje**: Django ma wbudowany system migracji, SQLAlchemy potrzebuje dodatkowego narzędzia jak Alembic. SQLAlchemy daje większą kontrolę i elastyczność (FastAPI, Flask, custom apps), Django ORM jest prostszy do nauczenia, ale tylko w ekosystemie Django.
Blog
Powiązane artykuły
GraalVM: Rewolucja w świecie wirtualnych maszyn
GraalVM wprowadza przełom w świecie wirtualnych maszyn, oferując wyjątkową uniwersalność i wydajność. Zaprojektowany z myślą o współczesnych wymaganiach programistycznych, umożliwia uruchamianie kodu napisanego w wielu językach, w tym Java, JavaScript, Python, i innych, na jednej platformie.
Co to jest Joomla i jakie daje możliwości?
Joomla to popularny system zarządzania treścią (CMS), który pozwala na łatwe tworzenie i zarządzanie witrynami internetowymi. Jest to otwarty i darmowy system, który jest dostępny dla każdego, kto chce stworzyć profesjonalną stronę internetową.
Liquibase - Klucz do skutecznego zarządzania bazą danych
Liquibase to otwarte narzędzie, które umożliwia skuteczne zarządzanie bazą danych. Za pomocą systemu śledzenia zmian, gwarantuje spójność danych, niezależnie od zastosowanej platformy. Pozwala na łatwe śledzenie, wersjonowanie oraz aktualizację schematów bazy danych - to klucz do skutecznego zarządzania DB.
Modele baz danych: Kluczowe rodzaje i ich zrozumienie
Zrozumienie różnych modeli baz danych to podstawa dla każdego specjalisty IT. Wśród nich wyróżniamy modele relacyjne, obiektowe, hierarchiczne, sieciowe i inne. Każdy z nich ma swoje unikalne cechy i zastosowania. W niniejszym artykule przyjrzymy się najważniejszym typom baz danych, by lepiej zrozumieć ich rolę i funkcjonowanie w świecie informatyki.
Data Definition Language: Co to jest i jak go używać?
Data Definition Language (DDL) to część języka SQL, który jest nieodłącznym elementem w strukturze danych. W naszym przewodniku omówimy dokładniej, czym jest DDL, jakie posiada składniki oraz na przykładach pokażemy jego praktyczne zastosowanie. Zapraszamy do lektury!
Data Manipulation Language: Klucz do zrozumienia manipulacji danymi
Technologia ewoluuje w zawrotnym tempie, a sukces w świecie IT zależy od ciągłego rozwijania umiejętności. Jednym z kluczy do opanowania dziedziny baz danych jest zrozumienie języka manipulacji danymi (DML). DML pozwala na efektywne zarządzanie danymi przechowywanymi w relacyjnych bazach danych. Ta wiedza jest nieoceniona zarówno dla nowicjuszy jak i doświadczonych programistów.





