Definiowanie modeli
Mapuj klasy na tabele
Definiowanie modeli to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.
Modele mapują się na tabele
W ORM SQLAlchemy model to klasa Pythona mapowana na tabelę bazy danych. Każda instancja staje się wierszem.
Modele dziedziczą po wspólnej klasie Base.
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
print('Base class ready')__tablename__
Każdy model ustawia __tablename__, aby nadać nazwę swojej tabeli. SQLAlchemy używa tej nazwy podczas generowania kodu SQL.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
print(User.__tablename__)Kolumny z użyciem Mapped
Współczesne wersje SQLAlchemy deklarują kolumny za pomocą adnotacji typów: Mapped[int] i mapped_column(). Adnotacja typu określa typ Pythona i dostarcza informacji o typie kolumny.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
age: Mapped[int]
print('User has id, name, age')Klucz główny
Oznacz kolumnę jako klucz główny za pomocą primary_key=True. Klucze główne typu całkowitego są domyślnie automatycznie zwiększane.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Product(Base):
__tablename__ = 'products'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
print('id is the primary key')Kolumny opcjonalne
Użyj Mapped[str | None] lub Optional[str], aby zezwolić na wartości NULL. Zwykłe Mapped[str] oznacza NOT NULL.
from typing import Optional
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
nickname: Mapped[Optional[str]]
print('nickname can be NULL')Wartości domyślne i unikalność
mapped_column() przyjmuje opcje takie jak unique=True i default=, aby dodawać ograniczenia oraz wartości zastępcze.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
email: Mapped[str] = mapped_column(unique=True)
active: Mapped[bool] = mapped_column(default=True)
print('email is unique, active defaults to True')Długość ciągu znaków
W przypadku baz danych, które tego wymagają, ustaw długość ciągu znaków za pomocą mapped_column(String(50)).
from sqlalchemy import String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(50))
print('name limited to 50 chars')Tworzenie schematu
Base.metadata.create_all(engine) tworzy tabele dla każdego modelu dziedziczącego po Base.
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
print('Schema created')Tworzenie instancji
Utwórz wiersz, inicjalizując model jak zwykły obiekt Pythona i przekazując wartości kolumn jako argumenty nazwane.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
u = User(name='Alice')
print(u.name)Dodawanie __repr__
Własna metoda __repr__ ułatwia debugowanie, ponieważ przejrzyście pokazuje dane obiektu.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
def __repr__(self):
return 'User(name=' + self.name + ')'
print(repr(User(name='Bob')))Modele pozostają zwykłym Pythonem
Model nadal jest zwykłą klasą. Możesz dodawać metody i właściwości operujące na jego danych, łącząc zachowanie z utrwalaniem danych.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
def greet(self):
return 'Hi, ' + self.name
print(User(name='Carol').greet())Szybki test
Sprawdź swoje umiejętności definiowania modeli.
Podsumowanie
Nauczyłeś się definiować modele ORM.
- Modele dziedziczą po
DeclarativeBasei ustawiają__tablename__ - Kolumny korzystają z
Mapped[type]imapped_column() primary_key,uniqueidefaultdodają ograniczeniacreate_all()tworzy tabele
Często zadawane pytania
Czy lekcja „Definiowanie modeli” jest bezpłatna?
Tak — pełny tekst „Definiowanie modeli” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Definiowanie modeli”?
Mapuj klasy na tabele Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Python Academy?
Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Definiowanie modeli”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?
Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- SQLAlchemy Core a ORM
- Definiowanie modeli
- Zapytania za pomocą Session
- Relacje i złączenia