Класс Result
Класс Result представляет собой объект,
который возвращается при выполнении запроса
через соединение или сессию. Он хранит
результаты выполнения SQL-запроса и
предоставляет набор методов для доступа к
данным: извлечение строк, скалярных значений,
словарей и работы с курсором. Объект
Result создается автоматически при вызове
методов execute, поэтому вручную его
инстанцировать не требуется. Класс поддерживает
итерацию, что позволяет перебирать строки
результата напрямую.
Синтаксис
res = conn.execute(text('SELECT ...'))
Пример
Давайте выполним простой запрос и получим
объект Result, а затем переберём его
строки через итерацию:
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 (id, title) VALUES (1, 'article 1')"))
conn.execute(text("INSERT INTO articles (id, title) VALUES (2, 'article 2')"))
res = conn.execute(text('SELECT id, title FROM articles ORDER BY id'))
print(type(res).__name__)
for row in res:
print(row)
Результат выполнения кода:
"Result"
(1, 'article 1')
(2, 'article 2')
Пример
Давайте получим все строки результата методом
all и выведем их в виде списка кортежей:
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 (id, title) VALUES (1, 'article 1')"))
conn.execute(text("INSERT INTO articles (id, title) VALUES (2, 'article 2')"))
res = conn.execute(text('SELECT id, title FROM articles ORDER BY id'))
rows = res.all()
print(rows)
Результат выполнения кода:
[(1, 'article 1'), (2, 'article 2')]
Пример
Давайте извлечём одну строку методом
first и получим скалярное значение
методом scalar:
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 (id, title) VALUES (1, 'article 1')"))
conn.execute(text("INSERT INTO articles (id, title) VALUES (2, 'article 2')"))
res = conn.execute(text('SELECT id, title FROM articles ORDER BY id'))
first_row = res.first()
print(first_row)
res2 = conn.execute(text('SELECT COUNT(*) FROM articles'))
count = res2.scalar()
print(count)
Результат выполнения кода:
(1, 'article 1')
2
Пример
Давайте проверим атрибуты returns_rows,
rowcount и closed у объекта
Result:
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 (id, title) VALUES (1, 'article 1')"))
conn.execute(text("INSERT INTO articles (id, title) VALUES (2, 'article 2')"))
res = conn.execute(text('SELECT id, title FROM articles'))
print(res.returns_rows)
print(res.rowcount)
print(res.closed)
res.close()
print(res.closed)
Результат выполнения кода:
True
2
False
True