Метод freeze класса Result
Метод freeze класса Result фиксирует результат выполнения запроса и возвращает новый объект Result, который можно многократно перебирать. По умолчанию объект Result является однопроходным: после того как строки были извлечены, повторный перебор невозможен. Метод freeze решает эту проблему, позволяя обращаться к данным повторно.
Параметров метод не принимает. Он возвращает новый объект Result, который поддерживает многократную итерацию.
Синтаксис
Result.freeze()
Пример
Давайте выполним запрос и попробуем перебрать результат дважды без фиксации:
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')"))
conn.commit()
res = conn.execute(text('SELECT * FROM articles'))
print(list(res))
print(list(res))
Результат выполнения кода:
[(1, 'article 1'), (2, 'article 2')]
[]
Второй перебор вернул пустой список, потому что результат уже был исчерпан.
Пример
Теперь применим метод freeze, чтобы зафиксировать результат и перебрать его несколько раз:
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')"))
conn.commit()
res = conn.execute(text('SELECT * FROM articles')).freeze()
print(list(res))
print(list(res))
Результат выполнения кода:
[(1, 'article 1'), (2, 'article 2')]
[(1, 'article 1'), (2, 'article 2')]
Теперь результат можно перебирать повторно без повторного выполнения запроса.
Пример
Давайте зафиксируем результат и воспользуемся методами first и 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 VALUES (1, 'article 1')"))
conn.execute(text("INSERT INTO articles VALUES (2, 'article 2')"))
conn.commit()
res = conn.execute(text('SELECT * FROM articles')).freeze()
print(res.first())
print(res.all())
print(res.first())
Результат выполнения кода:
(1, 'article 1')
[(1, 'article 1'), (2, 'article 2')]
(1, 'article 1')