2013-01-04 25 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()。