Как написать общий метод get_by_id () для всех видов моделей в Sqlalchemy? - PullRequest
1 голос
/ 03 сентября 2010

Я использую пилоны с sqlalchemy.У меня есть несколько моделей, и я обнаружил, что снова и снова пишу такой код:

question = Session.query(Question).filter_by(id=question_id).one()
answer = Session.query(Answer).fileter_by(id=answer_id).one()
...
user = Session.query(User).filter_by(id=user_id).one()

Поскольку все модели расширяют класс Base, есть ли способ определить общий метод get_by_id()?

Так что я могу использовать его как:

quesiton = Question.get_by_id(question_id)
answer = Answer.get_by_id(answer_id)
...
user = User.get_by_id(user_id)

Ответы [ 3 ]

3 голосов
/ 04 сентября 2010

Если id является вашим столбцом первичного ключа, вы просто делаете:

session.query(Foo).get(id)

, что дает преимущество в том, что он не запрашивает базу данных, если этот экземпляр уже находится в сеансе.

2 голосов
/ 03 сентября 2010

К сожалению, SQLAlchemy не позволяет вам создавать подклассы Base без соответствующего объявления таблицы.Вы можете определить класс mixin с get_by_id как метод класса, но тогда вам нужно будет указать его для каждого класса.

Более быстрое и грязное решение - просто обезьяна-пакетировать его в Base:

def get_by_id(cls, id, session=session):
    return session.query(cls).filter_by(id=id).one()

Base.get_by_id = classmethod(get_by_id)

Это предполагает, что у вас есть объект session, доступный во время определения, в противном случае вам придется каждый раз передавать его как аргумент.*

0 голосов
/ 03 сентября 2010
class Base(object):
    @classmethod
    def get_by_id(cls, session, id):
        q = session.query(cls).filter_by(id=id)
        return q.one()

Question.get_by_id(Session, question_id)
...