Атрибут name класса Column
Атрибут name класса Column хранит имя колонки,
под которым она зарегистрирована в таблице базы данных. Это имя используется
при генерации SQL-запросов, при обращении к колонке через метаданные таблицы,
а также при связывании ORM-атрибутов с реальными столбцами. Значение атрибута
задаётся либо явно первым позиционным аргументом при создании колонки,
либо автоматически, когда колонка объявляется через mapped_column
в декларативной модели.
Синтаксис
column.name
Пример
Давайте создадим колонку с явным именем и выведем его через атрибут name:
from sqlalchemy import Column, Integer, String, MetaData, Table
metadata = MetaData()
articles = Table(
'articles',
metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
)
col = articles.c.title
print(col.name)
Результат выполнения кода:
"title"
Пример
Давайте объявим декларативную модель и посмотрим,
какое имя получает колонка, заданная через mapped_column:
from sqlalchemy import String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String)
print(Article.__table__.c.id.name)
print(Article.__table__.c.title.name)
Результат выполнения кода:
"id"
"title"
Пример
Давайте зададим колонке имя, отличное от имени ORM-атрибута,
и проверим, что вернёт атрибут name:
from sqlalchemy import String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column('article_id', primary_key=True)
title: Mapped[str] = mapped_column('article_title', String)
print(Article.__table__.c.article_id.name)
print(Article.__table__.c.article_title.name)
Результат выполнения кода:
"article_id"
"article_title"
Пример
Давайте выполним запрос к базе и убедимся, что имя колонки совпадает с именем столбца в SQL-запросе:
from sqlalchemy import create_engine, String, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String)
status: Mapped[str] = mapped_column(String)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article', status='published'))
session.commit()
res = session.execute(select(Article.__table__.c.title)).all()
print(Article.__table__.c.title.name, res)
Результат выполнения кода:
"title [('article',)]"
Итоговый SQL запрос:
SELECT articles.title
FROM articles