我有一个跟踪项目并使用SQLObject
python的应用程序ORM
。在某个时间点,应用程序会检查表是否不是太大,如果表中的项目超过 10000 个,它会删除第一个N
项目,因此表中的项目为 10000 个。什么是优雅而有效的方式来写下这个SQLObject
?我所追求的所有解决方案都是缓慢而尴尬的:(。
问问题
783 次
3 回答
1
我个人没用过SQLOBJECT
。所以这是一个简单的删除语句,基于ordering records by inserted date
,最旧的N
记录将被删除并且它在MYSQL
. limit
由于这个错误,无法使用变量设置子句,所以我使用了最直接的方法。
对于这个样本,我使用了阈值,6
因为它很难10000
......
样品表:
COL1 COL2
1 112
2 0
3 20
4 10
5 100
6 30
7 200
8 108
set @table_count:=0;
set @excess_count:=0;
select count(*) into @table_count
from tablex;
select (case when @table_count > 6
then (@table_count -6)
else 0 end) into @excess_count
;
select *
from tablex
where col1 between 1 and @excess_count
order by col1 asc
;
选择的记录:
COL1 COL2
1 112
2 0
以上查询对记录进行排序,col1
您可以根据自己的需要进行更改。所以删除查询可以建立在最后一个select
. 所以最好写一个存储过程......因为这是一堆糟糕的语句......
于 2013-01-04T17:54:42.690 回答
1
我知道这个帖子很旧,但我想发布一个条目,以防有人通过谷歌搜索找到它,就像我一样。
我有一个类似的问题,我需要自定义删除调用。SQLObject 为您提供了两个选项来创建带有自定义 where 子句的 SQL DELETE:
- 使用 SQLBuilder 类构建它(参见http://sqlobject.org/SQLBuilder.html#delete)
- 直接调用 SQL 语句
我选择了第二个选项,因为它更灵活、更精简:
dsqlMetricseries._connection.query("DELETE FROM dsql_metricseries WHERE metric_id = %s"%metric_id)
- dsqlMetricseries : SQLObject 子类,代表数据库表的模型类
- _connection : SQLObject 内部数据库连接的句柄
- query : 用于执行任何 SQL 语句的 SQLObject 方法
于 2013-12-01T15:09:35.853 回答
0
如上所述,我意识到这是一篇旧帖子,但其他观众可能会觉得这很有用。我不确定切片选择的效率如何(假设记录 id 在您添加记录时上升)。
myselect = tableobject.select(orderBy=tableobject.q.id)
if myselect.count() > 10000:
tableobject.deleteMany(tableobject.q.id<myselect[10001].id)
未经测试,但我经常使用 deleteMany()。
于 2013-12-16T23:10:19.707 回答