Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 5, 2008 14:22:47

vigorouz
От:
Зарегистрирован: 2008-05-19
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

[sqlalchemy] Свои методы у модели

Есть модель, к примеру User, в коде самого приложения используется так:

...
u = User.query.filter_by(status=UNPROCESSED).one()
...
Можно ли сделать свой метод модели User, делающий тоже самое, чтобы можно было использовать его так:
...
u = User.get_next_unprocessed()
..



Офлайн

#2 Ноя. 5, 2008 15:54:24

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

[sqlalchemy] Свои методы у модели

Можно



Офлайн

#3 Ноя. 5, 2008 21:42:26

vigorouz
От:
Зарегистрирован: 2008-05-19
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

[sqlalchemy] Свои методы у модели

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() для апдейта, смешиваются два разных стиля (а это не хорошо :-)… может можно как то по-другому?

Поделитесь, плз, подходами к созданию подобных кастомных методов.



Офлайн

#4 Ноя. 6, 2008 01:57:23

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

[sqlalchemy] Свои методы у модели

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

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

..bw



Офлайн

#5 Ноя. 6, 2008 04:49:33

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

[sqlalchemy] Свои методы у модели

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



Офлайн

#6 Ноя. 6, 2008 05:21:45

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

[sqlalchemy] Свои методы у модели

> object_session проскользнул мимо…
Получается я не один такой :-).

..bw



Офлайн

#7 Ноя. 6, 2008 10:39:11

vigorouz
От:
Зарегистрирован: 2008-05-19
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

[sqlalchemy] Свои методы у модели

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



Офлайн

#8 Ноя. 6, 2008 15:58:01

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

[sqlalchemy] Свои методы у модели

Припоминаю. Я пропустил эту часть, так как предпочитаю создавать сессии явно.
Напоминает работу с Django ORM, почему мне Django и не нравится, отчасти по этому.

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

..bw



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version