SQLAlchemy
ΠΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ°ΠΌΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ β sqlalchemy. ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π±Π°Π· Π΄Π°Π½Π½ΡΡ . Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡ Π² ΡΠ°Π±ΠΎΡΠ΅ Ρ sqlalchemy.
alembic β ΠΏΠ°ΠΊΠ΅Ρ Π΄Π»Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΉ
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡ
Π΅ΠΌΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
ΠΠ°Π·ΠΎΠ²ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ
from sqlalchemy import Column, ForeignKey, String, Integer, Boolean, Table
from sqlalchemy.orm import declarative_base
from table_base import Base
from myrelationship import MyRelationship
Base = declarative_base()
class TableA(Base):
__tablename__ = "table_a"
key = Column(String(40), primary_key=True)
value = Column(Integer, ForeighKey('table_b.id'))
b = Column(Boolean)Base β ΡΡΠΎ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Ρ
ΡΠ°Π½ΠΈΡΡ Π²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²Π°ΡΠ΅ΠΉ Π±ΡΠ΄ΡΡΠ΅ΠΉ ΡΡ
Π΅ΠΌΠ΅ Π±Π°Π·Ρ. ΠΡΠΈ ΡΡΠΎΠΌ, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·. ΠΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ, Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡΡΡ ΠΎΡ Base.
Declarative vs. Imperative FormsΒΆ
Declarative Form with mapping (ΡΡΠΎ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄, Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ!)
Declarative Form without mapping (ΡΡΠΎ ΠΏΠΎ ΠΊΠ»Π°ΡΡΠΈΠΊΠ΅):
List and sets
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΡΠ²ΡΠ·ΠΈ ΠΌΠ°ΠΏΠΏΡΡΡΡ Π² List. ΠΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π² Set:
Imperative Form:
Π£ Π½Π°Ρ Π΅ΡΡΡ Π΄Π²Π΅ ΡΠ°Π±Π»ΠΈΡΡ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎ. ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ²ΡΠ·Ρ ΠΈΠΌΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎ:
ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡ
ΠΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡ Π΅ΠΌΡ Π±Π°Π·Ρ:
Relationships
One-to-One
ΠΠ° Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. Π’ΠΎ Π΅ΡΡΡ, ΠΌΡ ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΉ ΠΈ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ Π΄ΠΎΠ±ΠΈΠ²Π°Π΅ΠΌΡΡ One-to-One ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ. ΠΡΠΎ Π½ΡΠΆΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ΅Π±Π΅Π½ΠΎΠΊ, Π° Ρ ΡΠ΅Π±Π΅Π½ΠΊΠ° β ΠΎΠ΄ΠΈΠ½ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ.
One-to-Many
ΠΠ° Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ
ΠΠ»Ρ Π΄Π²ΡΠ½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΉ ΡΠ²ΡΠ·ΠΈ, ΡΡΠΎΠ±Ρ Child Π²ΠΈΠ΄Π΅Π» Parent ΡΠ΅Π»ΠΈΠΊΠΎΠΌ, Π° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ id (Π΄Π°Π»Π΅Π΅ Π½Π΅ Π½Π°Π΄ΠΎ Π±ΡΠ΄Π΅Ρ Π΄Π΅Π»Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΊΠΎΠ΄Π°), ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Child ΠΈ Parent ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
Many-to-One
ΠΠ° Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ
ΠΠ»Ρ Π΄Π²ΡΠ½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΉ ΡΠ²ΡΠ·ΠΈ, ΡΡΠΎΠ±Ρ ΠΈΠ· Child ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²ΡΠ΅Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ, ΠΏΠΎΠΌΠ΅Π½ΡΠ΅ΠΌ Parent ΠΈ Child ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ
Many-to-Many
ΠΠ° Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
ΠΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Ρ
ΡΠ°Π½ΠΈΡ Π²ΡΠ΅ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ ΠΈΠ· ΠΎΠ±ΠΎΠΈΡ
ΡΠ°Π±Π»ΠΈΡ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌ Π΅Π΅ ΡΠ΅ΡΠ΅Π· ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ secondary. Π§Π΅ΡΠ΅Π· ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ back_populates Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΡΠ²ΡΠ·Ρ.
ΠΡΠ»ΠΈ Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΡ Π΄ΠΎΠΏ ΠΏΠΎΠ»Ρ, ΠΈΠ»ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΡΠΎΠ±Ρ Π²ΡΠ΅ Π±ΡΠ»ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠΈΠ»Π΅, ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΡΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΊΠ°ΠΊ Child ΠΈ Parent: https://docs.sqlalchemy.org/en/14/orm/basic_relationships.html#association-object
ΠΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠΎΠ²
ΠΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅
Π Π°Π±ΠΎΡΠ° Ρ relationships
ΠΠ°ΡΡΠ΅ΡΠ½ Provider -> Repository -> Database
ΠΡΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΉ ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π±Π°Π·ΠΎΠΉ (ΠΈΠ· Π΄ΠΆΠ°Π²Ρ, Π½Π° ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΅Π³ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π² Python β Ρ Π·, Π½ΠΎ ΡΠ°ΠΊ ΠΏΠΎΠ½ΡΡΠ½Π΅Π΅ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ). Π‘ΡΡΡ Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ΠΈΠΈ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠΈ (ΡΡΠΎ Provider), CRUD-ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ (ΡΡΠΎ Repository) ΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Π±Π°Π·ΠΎΠΉ (ΡΡΠΎ Database).
ΠΡΠΈΠΌΠ΅Ρ:
database.py
repository.py
provider.py
ΠΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌΡΡ ΠΊ Π±Π°Π·Π΅
Transactions
ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ΅ΡΠ΅Π· SQLAlchemy ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ (Session): https://habr.com/ru/articles/597999/
databases
ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ Π±Π°Π·Π΅ Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΠΊΠ΅Ρ databases. Π’ΠΎΠ»ΡΠΊΠΎ ΡΡ Π΅ΠΌΡ Π±Π°Π·Ρ Π² Π±Π΄ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ΅ΡΠ΅Π· sqlalchemy (ΠΈΠ· ΠΎΠ±ΡΠ΅ΠΊΡΠ° Base).
Last updated