【问题标题】:SQLAlchemy: is it possible to store session wide propertiesSQLAlchemy:是否可以存储会话范围的属性
【发布时间】:2013-11-09 07:43:52
【问题描述】:

我正在开发一个使用 SQLALchemy 操作 SQL 表的软件。 用户将执行的每个操作(插入、修改、删除)都必须记录在特定的 LOG 表中。

日志表如下所示:

    +-----------+----------------------------------------------+
    |  user_id  |  log                                         |
    +-----------+----------------------------------------------+
    |       21  |  Value x added in table y                    |
    |       12  |  Value z deleted from table w                |

为了编写这样的日志,我在表 Log 中定义了一个函数,它插入一个具有以下原型的新日志。

class Foo(Base):
    __tablename__ = 'foo'
    id = Column(Integer, primary_key=True)
    value = Column(String)

        @staticmethod
    def insert(value):
        item = Foo()
        item.value = value
        session.add(item)
        Log.add(item)


class Log(Base):
    user_id = Column(Integer, not_null=True)
    value = Column(String, not_null=True)

    @saticmethod
    def add(item):
        logitem = Log()
        logitem.user_id = x
        logitem.value = "Insertion of %s" % item.value
        session.add(logitem)

上面的代码不起作用,因为没有定义用户的“x”。

我不想在调用 Foo.insert 方法时将 user_id 作为参数传递。我想知道是否可以将 user_id 绑定到会话,以便 user_id 定义一次并为所有 sql 查询保留。

【问题讨论】:

    标签: python session sqlalchemy


    【解决方案1】:

    据我所知,您不能将会话用作全局命名空间,而且它看起来也不是一个好主意。如果您确实需要这样做,它应该由您的应用程序使用您拥有的任何其他全局或会话状态来完成,而不是通过将 SQLAlchemy 耦合到您的身份验证/用户会话过程。

    【讨论】:

    • 一个用例是在外键追加事件上添加一个钩子。假设 Foo 与由 mapper("Foo",foo_table,property{'bar'=relationship(Bar)}) 定义的 Bar 具有 OneToMany 关系,然后我可以使用 foo.bar 从 Foo 访问所有子 bar 项,我也可以使用 foo.bar.append(new_bar) 将 bar 项添加到 foo 我可以添加一个事件侦听器来记录此类插入,但是侦听器需要能够检索用户登录。
    • 很好,但没有理由不在应用程序上下文中。无需为此创建会话命名空间。
    • 好吧,我可以修改我的钩子以从我的应用程序中调用一个方法,但随后模型将与应用程序纠缠在一起。另一方面,如果我的信息在会话中,那么它可能只是丢失了,并且挂钩可以使用默认用户名。
    猜你喜欢
    • 2011-02-06
    • 2015-08-02
    • 2012-08-28
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2011-09-02
    • 2014-12-02
    • 1970-01-01
    相关资源
    最近更新 更多