可以扩展SQLAlchemy以增加锁定数据库的功能吗?

1 投票
1 回答
538 浏览
提问于 2025-04-16 21:30

我正在开始开发一个使用Pyramid框架的网站,在决定使用SQLAlchemy之前,我想知道是否可以对它进行一些扩展,添加“数据库锁定”的功能。

我想要这个功能的一个简单例子是为了控制写入频率。我的扩展可以检测用户是否在频繁地向数据库写入数据,如果是的话,就会阻止他们在一段时间内继续写入。

我考虑过扩展sqlalchemy.org.session.Session,并重写add方法来进行这个频率检查。如果用户通过了检查,就会把查询交给super(MyWrapper, self).query(*args, **kargs)去处理。

这样做其实挺简单的。不过,这样只是在DBSession.query中添加了控制频率的功能。如果我在代码的其他地方使用了DBSession.execute,那么这个频率检查就会被绕过。

有没有更好的方法来实现这个功能呢?

1 个回答

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

撰写回答