2013-01-04 30 views
2

我有一个应用程序,可以跟踪物品并使用SQLObject python ORM。在某个时间点,应用会检查表格是否不太大,如果表格中的项目超过10000个,则会删除第一个N项目,因此表格中的项目为10000个。通过SQLObject写下这种优雅而有效的方法是什么?所有的解决方案我来了之后是缓慢和笨拙:(。SQLObject:如何从表中删除前N个对象?

+0

不知道这是否是正确的方向......也许你可以编写一个触发器来检查插入前的表行数,然后插入删除旧记录,其中计数将等于您计划的新记录数插入.. – bonCodigo

+0

@bonCodigo SQLObject是否支持触发器?可能吗?它可以连接没有任何触发器的数据库,例如'SQLite'O_O。 – grigoryvp

+0

它在这篇文章(http://sourceforge.net/projects/sqlobject/)中说它可以支持任何主要的RDBMS ...... [SQLite可以创建触发器](http://www.sqlite.org /lang_createtrigger.html)。但为什么不是一个简单的'删除'表达适合你?对不起,你真的需要专家的建议,我:Ancora Imparo ...并仍在探索:D – bonCodigo

回答

1

我个人没有使用SQLOBJECT。因此,这是一个基于ordering records by inserted date一个简单的删除语句,历史最悠久的N记录将被删除,它在MYSQL,无法设置limit clause using a variable due to this bug ,所以我用最直接的方法。

对于这个sampel我使用的阈值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上。所以最好写一个storedprocedure ...因为这全是一个akward一堆陈述...

+0

@Eye请看看这个...将更新当我得到时间写程序.. – bonCodigo

+0

谢谢,但我不认为它与ORM兼容,因为它使用本机SQL :(。 – grigoryvp

+0

@Eye Well * 'native' *并不意味着*'ANSI' *我想 - 然后你真的需要进入*'native' *语法并且尝试类似的逻辑..:$ – bonCodigo

1

我知道这个线程是旧的,但我想过发布一个条目,以防有人遇到它通过Google搜索,就像我一样。

我有一个类似的问题,我需要自定义删除调用。 SQLObject的给你两个选择创建具有where子句的自定义一个DELETE语句:

我与去第二个选项,因为它是更加灵活,简化的:

dsqlMetricseries._connection.query("DELETE FROM dsql_metricseries WHERE metric_id = %s"%metric_id) 
  • dsqlMetricserie S:SQLObject的子类,代表一个数据库表
  • _connection模型类:处理对SQLObject的内部数据库连接
  • 查询:SQLObject的方法用于执行如上任何SQL语句
0

,我意识到这是旧的文章但其他观众可能会觉得这很有用。 我不知道这将切分选择(假设记录ID是随着您添加记录升序)。

myselect = tableobject.select(orderBy=tableobject.q.id) 
if myselect.count() > 10000: 
    tableobject.deleteMany(tableobject.q.id<myselect[10001].id) 

未经测试,但我经常使用deleteMany()。