Метод fetchall класса Result
Метод fetchall класса Result
возвращает все оставшиеся строки результата
в виде списка объектов Row. Метод не
принимает параметров и полностью опустошает
буфер результата: после его вызова повторный
вызов вернет пустой список.
Метод удобно использовать, когда нужно заранее получить весь набор строк для дальнейшей обработки в памяти.
Синтаксис
res.fetchall()
Пример
Давайте создадим таблицу articles,
вставим несколько строк и получим все строки
методом fetchall:
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, text TEXT, status TEXT, num INTEGER)'))
conn.execute(text('INSERT INTO articles (id, title, text, status, num) VALUES (1, :t, :x, :s, :n)'), {'t': 'article 1', 'x': 'text 1', 's': 'draft', 'n': 10})
conn.execute(text('INSERT INTO articles (id, title, text, status, num) VALUES (2, :t, :x, :s, :n)'), {'t': 'article 2', 'x': 'text 2', 's': 'published', 'n': 20})
conn.execute(text('INSERT INTO articles (id, title, text, status, num) VALUES (3, :t, :x, :s, :n)'), {'t': 'article 3', 'x': 'text 3', 's': 'draft', 'n': 30})
res = conn.execute(text('SELECT * FROM articles'))
rows = res.fetchall()
for row in rows:
print(row)
Результат выполнения кода:
(1, 'article 1', 'text 1', 'draft', 10)
(2, 'article 2', 'text 2', 'published', 20)
(3, 'article 3', 'text 3', 'draft', 30)
Пример
Давайте обратимся к столбцам строки по именам после получения всех строк:
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, text TEXT, status TEXT, num INTEGER)'))
conn.execute(text('INSERT INTO articles (id, title, text, status, num) VALUES (1, :t, :x, :s, :n)'), {'t': 'article 1', 'x': 'text 1', 's': 'draft', 'n': 10})
conn.execute(text('INSERT INTO articles (id, title, text, status, num) VALUES (2, :t, :x, :s, :n)'), {'t': 'article 2', 'x': 'text 2', 's': 'published', 'n': 20})
res = conn.execute(text('SELECT id, title FROM articles'))
rows = res.fetchall()
for row in rows:
print(row.title, row.num if 'num' in row._fields else '-')
Результат выполнения кода:
article 1 -
article 2 -
Пример
Давайте убедимся, что после вызова
fetchall буфер результата пуст и
повторный вызов возвращает пустой список:
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, text TEXT, status TEXT, num INTEGER)'))
conn.execute(text('INSERT INTO articles (id, title, text, status, num) VALUES (1, :t, :x, :s, :n)'), {'t': 'article 1', 'x': 'text 1', 's': 'draft', 'n': 10})
conn.execute(text('INSERT INTO articles (id, title, text, status, num) VALUES (2, :t, :x, :s, :n)'), {'t': 'article 2', 'x': 'text 2', 's': 'published', 'n': 20})
res = conn.execute(text('SELECT * FROM articles'))
first = res.fetchall()
second = res.fetchall()
print(first)
print(second)
Результат выполнения кода:
[(1, 'article 1', 'text 1', 'draft', 10), (2, 'article 2', 'text 2', 'published', 20)]
[]
Пример
Давайте получим итоговый SQL-запрос, который выполняется при выборке всех строк:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:', echo=True)
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER, title TEXT, text TEXT, status TEXT, num INTEGER)'))
conn.execute(text('INSERT INTO articles (id, title, text, status, num) VALUES (1, :t, :x, :s, :n)'), {'t': 'article 1', 'x': 'text 1', 's': 'draft', 'n': 10})
res = conn.execute(text('SELECT * FROM articles'))
rows = res.fetchall()
print(rows)
Итоговый SQL запрос:
SELECT * FROM articles