Метод mappings класса Result
Метод mappings класса Result возвращает объект
MappingResult, который позволяет перебирать строки
результата запроса в виде словарей. Ключами словаря
выступают имена колонок, а значениями - соответствующие
значения из строки. Это удобно, когда нужно получить
данные по имени колонки, а не по индексу. Метод не
принимает параметров и может быть вызван как у результата
выполнения запроса, так и у результата выборки ORM.
Синтаксис
res.mappings()
Пример
Давайте выполним простой запрос и получим строки в виде словарей:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER, title TEXT)'))
conn.execute(text("INSERT INTO articles VALUES (1, 'article 1')"))
conn.execute(text("INSERT INTO articles VALUES (2, 'article 2')"))
res = conn.execute(text('SELECT id, title FROM articles'))
for row in res.mappings():
print(dict(row))
Результат выполнения кода:
{'id': 1, 'title': 'article 1'}
{'id': 2, 'title': 'article 2'}
Пример
Давайте обратимся к значениям словаря по имени колонки:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER, title TEXT, status TEXT)'))
conn.execute(text("INSERT INTO articles VALUES (1, 'article', 'published')"))
res = conn.execute(text('SELECT id, title, status FROM articles'))
row = res.mappings().first()
print(row['id'], row['title'], row['status'])
Результат выполнения кода:
1 article published
Пример
Давайте используем метод mappings вместе с ORM-запросом
по модели:
from sqlalchemy import create_engine, String
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(50))
status: Mapped[str] = mapped_column(String(20))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(id=1, title='article', status='draft'))
session.commit()
res = session.query(Article.id, Article.title, Article.status).all()
for row in res:
print({'id': row.id, 'title': row.title, 'status': row.status})
res2 = session.execute(
Article.__table__.select()
)
for row in res2.mappings():
print(dict(row))
Результат выполнения кода:
{'id': 1, 'title': 'article', 'status': 'draft'}
{'id': 1, 'title': 'article', 'status': 'draft'}