Функция synonym
Функция synonym создает синоним для
атрибута модели SQLAlchemy. Первым параметром
функция принимает имя существующего атрибута,
для которого создается синоним. Это позволяет
обращаться к одному и тому же столбцу таблицы
под разными именами, что удобно при переименовании
полей или при необходимости иметь несколько
вариантов доступа к данным. Синоним работает
как в Python-коде, так и в запросах на уровне
ORM.
Синтаксис
synonym(name, [map_column], [descriptor])
Пример
Давайте создадим модель с синонимом для
столбца title, чтобы обращаться к нему
как heading:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, synonym, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
heading = synonym('title')
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article 1')
session.add(article)
session.commit()
res = session.query(Article).first()
print(res.heading)
Результат выполнения кода:
"article 1"
Пример
Давайте установим значение через синоним и проверим, что оно сохранилось в исходный столбец:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, synonym, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
text: Mapped[str] = mapped_column(String(500))
heading = synonym('title')
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(text='some text')
article.heading = 'article 2'
session.add(article)
session.commit()
res = session.query(Article).first()
print(res.title)
print(res.heading)
Результат выполнения кода:
"article 2"
"article 2"
Пример
Давайте используем параметр map_column,
чтобы синоним автоматически отображался на
существующий столбец базы данных:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, synonym, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
heading = synonym('title', map_column=True)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article 3')
session.add(article)
session.commit()
res = session.query(Article).filter(Article.heading == 'article 3').first()
print(res.title)
Результат выполнения кода:
"article 3"
Смотрите также
-
функцию
column_property,
которая создает вычисляемый атрибут модели -
функцию
deferred,
которая откладывает загрузку столбца -
функцию
mapped_column,
которая описывает столбец модели -
функцию
composite,
которая объединяет несколько столбцов в один атрибут