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

Содержимое удалено Содержимое добавлено
м →‎См. также: уборка вторых лишних шаблонов "по алфавиту" с помощью AWB
Строка 24:
 
== Объектно-реляционная модель SQLAlchemy ==
 
'''Соединение с базой данных'''
 
Строка 109 ⟶ 108 :
</source>
 
Выше - — функция ''declarative_base()'', что определяет новый класс, который мы назвали ''Base'', от которого будет унаследованы все наши ORM-классы. Обратите внимание: мы определили объекты Column безо всякой строки имени, так как она будет выведена из имени своего атрибута.
Низлежащий объект ''Table'', что создан нашей ''declarative_base()'' версией ''User'', доступен через атрибут ''__table__''
<source lang=python>>>> users_table = User.__table__</source>
Строка 118 ⟶ 117 :
'''Создание сессии'''
 
Теперь мы готовы начать наше общение с базой данных. «Ручка» базы в нашем случае — это сессия ''Session''. Когда сначала мы запускаем приложение, на том же уровне нашего ''create_engine()'' мы определяем класс ''Session'', что служит фабрикой объектов ''сессий'' (''Session'').
<source lang=python>>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)</source>
Строка 135 ⟶ 134 :
>>> session.add(vasiaUser)
</source>
Этот объект будет находиться в ожидании сохранения, никакого SQL-запроса пока послано не будет. Сессия пошлет SQL-запрос, чтобы сохранить Васю, как только это понадобится, используя процесс сброса на диск(flush). Если мы запросим Васю из базы, то сначала вся ожидающая информация будет сброшена в базу, а запрос последует потом. Для примера, ниже мы создадим новый объект запроса (''Query''), который загружает User-объекты. Мы «отфильтровываем» по атрибуту «имя=Вася» и говорим, что нам нужен только первый результат из всего списка строк. Возвращается тот User, который равен добавленному:
<source lang=python>>>> ourUser = session.query(User).filter_by(name="vasia").first()
<User('vasia','Vasiliy Pypkin', 'vasia2000')></source>
На самом деле сессия определила, что та запись из таблицы, что она вернула, та же самая, что аи запись, что она уже представляла в своей внутренней хеш-таблицутаблице объектов. Так что мы просто получили точно тот же самый объект, что только что добавили.
 
Та концепция ORM, что работает здесь, известная как ''карта идентичности'', обеспечивает, что все операции над конкретной записью внутри сессии оперируют одним и тем же набором данных. Как только объект с неким первичным ключом появится в сессии, все SQL-запросы на этой сессии вернут тот же самые питоний объект для этого самого первичного ключа. Будет выдана ошибка в случае попытки поместить в эту сессию другой, уже сохраненный объект с тем же первичным ключом.
 
Мы можем добавить больше User-объектов, использовав ''add_all()''
<source lang=python>>>> session.add_all([User("kolia", "Cool Kolian[S.A.]","kolia$$$"), User("zina", "Zina Korzina", "zk18")]) #добавить сразу пачку записей</source>
Строка 194 ⟶ 195 :
kolia Cool Kolian[S.A.]
zina Zina Korzina</source>
Кортежи, которые возвращаются в запросе, являются именованными, и могут обрабатываться, как обычные объекты Python'аPython’а. Имена такие же, как и имена атрибутов для атрибутов, и имена классов для классов:
<source lang=python>>>> for row in session.query(User, User.name).all():
... print row.User, row.name
Строка 208 ⟶ 209 :
<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]:
... print u
Строка 217 ⟶ 218 :
... print name
vasia</source>
...либо…либо ''filter()'', которая использует более подходящие для ''SQL'' конструкции языка. Это позволяет использовать более привычные операторы Python'аPython’а с атрибутами класса вашего отображения класса:
<source lang=python>>>> for name, in session.query(User.name).filter(User.fullname=='Vasiliy Pupkin'):
... print name