在SQLalchemy模型中存储运行时信息的最佳方法是什么?

时间:2014-02-04 05:35:09

标签: python sqlalchemy

在模型中存储运行时信息的最佳方法是什么? 将模型存储在模型中(如在线/离线等)是个好主意

例如:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(String, unique=True, nullable=False)
    fullname = Column(String, default='')
    password = Column(String, nullable=False)
    role = Column(String, nullable=False)
    status = {0: "Offline", 1: "Online", -1: "Unknown"}

    def __init__(self, **kwargs):
        Base.__init__(self, **kwargs)
        self.init_status()

    @orm.reconstructor
    def init_status(self):
        self._online = 0

    @property
    def online(self):
        if self._online is None:
            self._online = 0
        if self.enable:
            return self._online
        return -1

    @online.setter
    def online(self, value):
        if value != self.online:
            dispatcher.send(sender=self, signal="state", value=value)
            self._online = value

如果我从会话中得到对象,就像 user = session.query(User).get(1) 改变状态 user.online = 1 在session.close()之后,我有了分离对象

我是否总是必须在commit()之后和close()之前执行expunge(user) 如果我想改变它,我必须将它添加到新的会话,然后再次提交,删除,关闭

还有其他方法吗?

P.S。 什么是最常用的练习,创建DAO层或会话它像DAO层一样自行工作?

我需要在应用程序的整个生命周期中访问此状态,但是我认为它并不是一直使用一个会话的好方法。 正确的方法,打开会话,用数据库做我所有的东西,然后关闭会话。但后来我失去了我的状态。

在java中我有DAO层和业务对象,它存储我的所有数据库字段和所有状态,而不管会话。 但是使用SA我已经有了session,DBO对象和Manager对象。我不想创建这么多层,我认为它不是pythonic。

感谢。

1 个答案:

答案 0 :(得分:-1)

您应该将状态也存储在DB而不是内存中。

由于它不是用户数据,最好是具有用户ID FK的不同表UserSession。 如果这样做,您也可以存储其他数据,例如lastlogintime。 甚至做出明智的决定,比如lastlogintime> 30分钟,您可以将状态更改为离线。

将这种状态存储在记忆中不是一个好主意。

相关问题