通过declaritive_base类方法获取SQLAlchemy查询对象

3 投票
1 回答
1643 浏览
提问于 2025-04-16 21:31

我总觉得在SQLAlchemy中进行查询时需要的按键数量有点多。

DBSession.query(User).filter(...).first()

这样做有什么问题吗?

DBSession = scoped_session(sessionmaker())

class BaseWithDBSession(object):
    def delete(self):
        DBSession.delete(self)

    @classmethod
    def query(cls):
        return DBSession.query(cls)


Base = declarative_base(cls=BaseWithDBSession)

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    ...

user = User.query().filter(User.id==1).one()
user.delete()

我觉得这种方法看起来整洁多了,而且我也不需要在不同的代码文件之间导入DBSession。缺点是我所有的类都绑定到一个特定的会话上,但我想不出有什么情况需要不同的设置。我在想为什么之前没见过这种方法(除了我经验不足)……

1 个回答

1

其实,有很多方法可以做到这一点。你可以看看Mike Bayer写的那篇带点调侃的文章,关于Magic,一个“新”的ORM。SQLAlchemy被定位为一个工具包,而不是一个框架,这样它就可以根据不同的需求在不同的场景中使用。例如,有些情况下,单个会话可能不够用。

另外,还有一些第三方的声明性层可以在SQLAlchemy之上使用,比如Elixir。它提供了一种稍微不同的做法。

撰写回答