SQLAlchemy: различия между версиями

Содержимое удалено Содержимое добавлено
Исправление грамматических ошибок.
Строка 89:
</source>
 
Атрибут ''id'', который не определен в ''__init__'', все равно существует из-за того, что колонка ''id'' существует в объекте таблицы ''users_table''. Стандартно ''mapper()'' создает атрибуты класса для всех колонок, что есть в ''Table''. Эти атрибуты существуют как питоньиPython дескрипторы и определяют его функциональность. Она может быть очень богатой и включать в себе возможность отслеживать изменения и АВТОМАТИЧЕСКИ подгружать данные в базу, когда это необходимо.
Так как мы не сказали SQLAlchemy сохранить Василия в базу, его ''id'' выставлено на ''None''. Когда позже мы сохраним его, в этом атрибуте будет храниться некое автоматически сформированное значение.
 
Строка 156:
На самом деле сессия определила, что та запись из таблицы, что она вернула, та же самая, что и запись, что она уже представляла в своей внутренней хеш-таблице объектов. Так что мы просто получили точно тот же самый объект, который только что добавили.
 
Та концепция ORM, что работает здесь, известная как ''карта идентичности'', обеспечивает, что все операции над конкретной записью внутри сессии оперируют одним и тем же набором данных. Как только объект с неким первичным ключом появится в сессии, все SQL-запросы на этой сессии вернут тотте же самые питоний объектобъекты для этого самого первичного ключа. Будет выдана ошибка в случае попытки поместить в эту сессию другой, уже сохраненный объект с тем же первичным ключом.
 
Мы можем добавить больше User-объектов, использовав ''add_all()''
Строка 170:
А теперь мы скажем нашей сессии, что мы хотим отправить все оставшиеся изменения в базу и применить все изменения, зафиксировав транзакцию, которая до того была в процессе. Это делается с помощью ''commit()'':
<source lang=python>session.commit()</source>
''commit()'' сбрасывает все оставшиеся изменеияизменения в базу и фиксирует транзакции. Ресурсы подключений, что использовались в сессии, снова освобождаются и возвращаются в набор. Последовательные операции с сессией произойдут в новой транзакции, которая снова запросит себе ресурсов по первому требованию.
Если посмотреть васинВасин атрибут id, что раньше был None, то мы увидим, что ему присвоено значение:
<source lang=python>
vasiaUser.id
Строка 211:
# kolia Cool Kolian[S.A.]
# zina Zina Korzina</source>
Запрос также поддерживает в качестве аргументов дескрипторы, созданные с помощью ORM. Каждый раз, когда запрашиваются разнообразные объекты классов или много-колоночныемногоколоночные объекты в качестве аргументов функции ''query()'', результаты возвращаются в виде кортежей:
<source lang=python>
for name, fullname in session.query(User.name, User.fullname):
Строка 236:
# <User('kolia','Cool Kolian[S.A.]', 'kolia$$$')> kolia
# <User('zina','Zina Korzina', 'zk18')> zina</source>
Базовые операции с запросами включают в себя ''LIMIT'' и ''OFFSET'', которые удобно использовать с Python’кимисо срезами массивов из Python, и обычно в сочетании с ''ORDER BY'':
<source lang=python>
for u in session.query(User).order_by(User.id)[1:2]: