Найти - Пользователи
Полная версия: [sqlalchemy] Свои методы у модели
Начало » Базы данных » [sqlalchemy] Свои методы у модели
1
vigorouz
Есть модель, к примеру User, в коде самого приложения используется так:
...
u = User.query.filter_by(status=UNPROCESSED).one()
...
Можно ли сделать свой метод модели User, делающий тоже самое, чтобы можно было использовать его так:
...
u = User.get_next_unprocessed()
..
j2a
Можно
vigorouz
j2a
Можно
ок. спасибо ;-)

Покопался в форуме и документации, и сделал так:
...
import schema as s

...

class User(OrmObject):
@classmethod
def get_next_unprocessed(cls):
user = cls.query.from_statement("select * from %s "
"where status=:status for update" % s.users.name).\
params(status=ST_UNPROCESSED).first()
if user:
session = object_session(user)
user.status = ST_HZ
session.commit()
return user

Session.mapper(Users, s.users)
Есть ли более внятная, чем та что у меня, замена select … for update?

Не нравится работа с сессией в этом коде, как то не упорядочено: просто cls.query для селекта, в то же время получение сессии объекта и session.commit() для апдейта, смешиваются два разных стиля (а это не хорошо :-)… может можно как то по-другому?

Поделитесь, плз, подходами к созданию подобных кастомных методов.
bw
Я не знаю что такое “for update” :-).
Во всем остальном не вижу проблемы, но я часто передаю session=None в подобные методы. В таком случае, либо используется переданная в параметрах сессия, либо создается локальная.

> User.query
С таким не сталкивался. Пойду читать документацию. Сессия создаётся во время запроса?
Я просто знаю, что если на сессию нет ссылок она уничтожается (нормальное поведение Python-объектов) и все ассоциированные объекты (результат запроса user) отвязываются от этой сессии. Соответственно ты не сможешь получить сессию через object_session.

..bw
Андрей Светлов
Мдаа. С SQLAlchemy работал с бородатой 0.1 версии, но после каждого нового релиза выползают неизведанные возможности. И чтение CHANGES не всегда помогает.
object_session проскользнул мимо…
Спасибо.
bw
> object_session проскользнул мимо…
Получается я не один такой :-).

..bw
vigorouz
bw
> User.query
С таким не сталкивался. Пойду читать документацию. Сессия создаётся во время запроса?
Что то вроде того. http://www.sqlalchemy.org/docs/04/session.html#unitofwork_contextual_associating
bw
Припоминаю. Я пропустил эту часть, так как предпочитаю создавать сессии явно.
Напоминает работу с Django ORM, почему мне Django и не нравится, отчасти по этому.

> Я просто знаю, что если на сессию нет ссылок она уничтожается
С такими сессиями этого не будет происходить.

..bw
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB