通过declaritive_base类方法获取SQLAlchemy查询对象
我总觉得在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。它提供了一种稍微不同的做法。