アイテムを追跡し、SQLObject
pythonを使用するアプリケーションがありますORM
。ある時点で、アプリはテーブルが大きすぎないかどうかをチェックし、テーブル内のアイテムが 10000 を超える場合は、最初のN
アイテムを削除してテーブル内のアイテムを 10000 にします。を介してこれを書き留めるエレガントで効果的な方法は何SQLObject
ですか? 私が求めているすべてのソリューションは遅くて厄介です:(。
3 に答える
個人的には使用していません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つの厄介なステートメントの集まりです...
このスレッドが古いことは承知していますが、誰かが Google 検索で見つけた場合に備えて、私と同じようにエントリを投稿することにしました。
カスタムの削除呼び出しが必要な同様の問題がありました。SQLObject には、カスタム where 句を使用して SQL DELETE を作成するための 2 つのオプションがあります。
- SQLBuilder クラスを使用して構築しました ( http://sqlobject.org/SQLBuilder.html#deleteを参照) 。
- SQL ステートメントを直接呼び出す
より柔軟で合理化された2番目のオプションを使用しました。
dsqlMetricseries._connection.query("DELETE FROM dsql_metricseries WHERE metric_id = %s"%metric_id)
- dsqlMetricseries : SQLObject サブクラス、DB テーブルを表すモデル クラス
- _connection : SQLObject の内部 DB 接続へのハンドル
- query : SQL ステートメントを実行するための SQLObject メソッド
上記のように、これは古い投稿であることは認識していますが、他の視聴者にとっては役立つかもしれません。これが選択をスライスするのにどれほど効率的かはわかりません(レコードを追加するときにレコードIDが昇順であると仮定します)。
myselect = tableobject.select(orderBy=tableobject.q.id)
if myselect.count() > 10000:
tableobject.deleteMany(tableobject.q.id<myselect[10001].id)
テストしていませんが、定期的に deleteMany() を使用しています。