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。したがって、ストアドプロシージャを作成するのが最善です...これはすべて1つの厄介なステートメントの集まりです...

于 2013-01-04T17:54:42.690 に答える
1

このスレッドが古いことは承知していますが、誰かが Google 検索で見つけた場合に備えて、私と同じようにエントリを投稿することにしました。

カスタムの削除呼び出しが必要な同様の問題がありました。SQLObject には、カスタム where 句を使用して SQL DELETE を作成するための 2 つのオプションがあります。

より柔軟で合理化された2番目のオプションを使用しました。

dsqlMetricseries._connection.query("DELETE FROM dsql_metricseries WHERE metric_id = %s"%metric_id)
  • dsqlMetricseries : SQLObject サブクラス、DB テーブルを表すモデル クラス
  • _connection : SQLObject の内部 DB 接続へのハンドル
  • 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 に答える