2

我有一个跟踪项目并使用SQLObjectpython的应用程序ORM。在某个时间点,应用程序会检查表是否不是太大,如果表中的项目超过 10000 个,它会删除第一个N项目,因此表中的项目为 10000 个。什么是优雅而有效的方式来写下这个SQLObject?我所追求的所有解决方案都是缓慢而尴尬的:(。

4

3 回答 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:

我选择了第二个选项,因为它更灵活、更精简:

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 回答