我开始在Pyramid中开发一个网站,在我提交使用SQLAlchemy之前,想知道是否可以将其包装/扩展以添加“数据库锁定”功能。
为什么我喜欢这个功能的一个简单示例是写限制。我的包装器将能够检测用户是否使用写入来充斥数据库,如果是,则会阻止他们在X时间内进一步写入。
我正在考虑扩展sqlalchemy.org.session.Session
并覆盖执行此节流检查的add
方法。如果用户通过了检查,则只会将查询传递给super(MyWrapper, self).query(*args, **kargs)
这很容易做到。但是,它仅将节流功能添加到DBSession.query
。如果我的代码中某处使用DBSession.execute
,则会绕过油门检查。
有没有更简洁的方法来实现这一目标?
答案 0 :(得分:1)
在ORM之外检测来自特定客户端的过多网络流量,甚至在Python应用程序之外,例如在网络或数据库客户端配置级别。
如果在Python应用程序中,绝对不在ORM中。在任何情况下,add()
都不能非常干净地与SQL语句相对应(在flush()之前不会发出SQL,并且只有当给定的对象先前处于挂起状态时.add()也会级联到许多对象并导致任意数量的INSERT语句。)
对于简单的count语句,光标执行事件是最好的方法。这为您在DBAPI游标上调用execute()提供了一个钩子。请参阅http://www.sqlalchemy.org/docs/core/events.html#connection-events上的before_cursor_execute()。