SQLAlchemy: кто отвечает за «сессию»? (и как провести юнит-тестирование с сессиями) - PullRequest
2 голосов
/ 10 апреля 2010

Мне нужно несколько советов о том, как использовать session объекты с SQLAlchemy и как организовать модульные тесты моих сопоставленных объектов.

Что я хотел бы сделать, это примерно так:

thing = BigThing() # mapped object
child = thing.new_child() # create and return a related object
thing.save() # will also save the child object

Чтобы достичь этого, я думал о том, чтобы BigThing фактически добавил себя (и его детей) в базу данных - но, может быть, это не очень хорошая идея?

Одной из причин добавления объектов как можно скорее является автоматическое id значения, которые назначаются базой данных - чем раньше они доступны, тем меньше проблем (верно?)

Каков наилучший способ управления session объектами? Кто отвечает за session?
Должен ли он быть создан только тогда, когда это необходимо? или долго сохраняли?

Как насчет модульных тестов для моих сопоставленных объектов? ... как обрабатывать session? Можно ли когда-нибудь сопоставлять объекты, просто автоматически добавляя себя в базу данных? или это приведет к неприятностям?

1 Ответ

2 голосов
/ 12 апреля 2010

Сессия похожа на ящик, в котором вы храните объекты. Конечно, вы можете написать __init__ метод для автоматического добавления объекта в него, но это подразумевает, что это какой-то глобальный (единственный) сеанс. Конечно, это вызовет проблемы во многих случаях, но также это немного упростит написание кода. Это явная и неявная дилемма. Некоторые люди следуют Zen of Python, а некоторые нет. Я предпочитаю указывать ящик для хранения явно.

Обратите внимание, что нет необходимости явно добавлять дочерние элементы в сеанс, поскольку он связан с объектом, уже находящимся в сеансе через отношение. Вот для чего каскадные правила . Значение по умолчанию 'save-update' делает именно то, что вы запрашиваете. Вас также может заинтересовать 'all, delete-orphan' для реализации «частных» объектов, которые должны быть удалены вместе с их родителями.

Я вижу некоторые проблемы для реализации метода save(). Нельзя сказать «сохранить эти объекты» в SQLAlchemy в текущей версии. Ранее такая способность была, но она никогда не была надежной. Session.flush() (вызывается из Session.commit()) сбрасывает все изменения в базе данных. Это, вероятно, самая раздражающая особенность SQLAlchemy, которая мешает мне использовать его в определенных проектах.

Модульное тестирование очень просто (по крайней мере, если вы явно указываете сеанс), см. Пример кода в другом вопросе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...