可以扩展SQLAlchemy以增加锁定数据库的功能吗?
我正在开始开发一个使用Pyramid框架的网站,在决定使用SQLAlchemy之前,我想知道是否可以对它进行一些扩展,添加“数据库锁定”的功能。
我想要这个功能的一个简单例子是为了控制写入频率。我的扩展可以检测用户是否在频繁地向数据库写入数据,如果是的话,就会阻止他们在一段时间内继续写入。
我考虑过扩展sqlalchemy.org.session.Session
,并重写add
方法来进行这个频率检查。如果用户通过了检查,就会把查询交给super(MyWrapper, self).query(*args, **kargs)
去处理。
这样做其实挺简单的。不过,这样只是在DBSession.query
中添加了控制频率的功能。如果我在代码的其他地方使用了DBSession.execute
,那么这个频率检查就会被绕过。
有没有更好的方法来实现这个功能呢?
1 个回答
如果你想检测某些客户的网络流量过多,可能需要在ORM之外,甚至在Python应用程序之外进行,比如在网络或数据库客户端的配置层面。
如果是在Python应用程序内部,肯定不是在ORM里。因为add()
这个方法和SQL语句的对应关系并不太清晰(实际上,直到调用flush()之前,并不会生成任何SQL语句,而且只有在对象之前是待处理状态时才会生成。add()
还会影响到很多对象,可能会导致生成多条INSERT语句)。
如果你只是想简单地统计语句数量,使用游标执行事件是最好的方法。这让你可以在调用数据库API游标的execute()时进行监控。你可以查看before_cursor_execute()
,详细信息可以在这个链接找到:http://www.sqlalchemy.org/docs/core/events.html#connection-events。