Python SQLAlchemy:是否可以存储会话范围的属性
我正在开发一个使用SQLALchemy操作SQL表的软件。 用户将执行的每个操作(插入、修改、删除)都必须记录在特定的日志表中 日志表如下所示:Python SQLAlchemy:是否可以存储会话范围的属性,python,session,sqlalchemy,Python,Session,Sqlalchemy,我正在开发一个使用SQLALchemy操作SQL表的软件。 用户将执行的每个操作(插入、修改、删除)都必须记录在特定的日志表中 日志表如下所示: +-----------+----------------------------------------------+ | user_id | 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作为参数传递。我想知道是否可以将用户id绑定到会话,这样用户id将被定义一次并在所有sql查询中持久化。据我所知,您不能将会话用作全局命名空间,而且这看起来也不是一个好主意。如果您真的需要这样做,那么应该由您的应用程序使用您拥有的任何其他全局或会话状态来完成,而不是通过将SQLAlchemy耦合到您的身份验证/用户会话过程。这方面的一个用例是在foreignkey append事件上添加一个钩子。假设Foo与mapper定义的Bar有一个OneToMany关系(“Foo”,Foo_table,property{'Bar'=relationship(Bar)}),那么我可以使用Foo.Bar从Foo访问所有子Bar项,我还可以使用Foo.Bar.append(new_Bar)向Foo添加一个Bar项,我可以添加一个事件侦听器来记录这些插入,但是,侦听器需要能够检索用户登录名。很好,但是没有理由不在应用程序上下文中。没有必要为此创建会话名称空间,我可以修改我的钩子,从我的应用程序中调用一个方法,但是模型将与应用程序纠缠在一起。另一方面,如果我的信息在会话中,那么它可能会丢失,钩子可以使用默认用户名。