問題タブ [django-mysql]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
django - Django - queryset iterator() の使用中に別のクエリを実行できない
MySQLでDjango 1.11を使用しています。2 へのアップグレードは短期的には実行できないため、当面の問題に対する受け入れ可能な解決策ではありませんが、Django 2 を参照する回答は他の人に役立つ可能性があるため、気軽に投稿してください。
テーブル内のすべての行に対してデータ移行を実行する必要があります。行数は 40000 未満ですが、かなり大きいです。列のうちの 2 つは、モデルのロード時に解析される 15KB までの JSON です。(これらはデータ移行で使用する必要がある行なので、延期することはできません)
すべてのオブジェクトを同時にメモリにロードしないように、一度に100 行しか解析しないqueryset.iteratorを使用すると考えました。これは、結果を読み取るだけであれば問題なく動作しますが、別のクエリを (たとえばsave
、オブジェクトの 1 つに対して) 実行すると、現在の 100 個の結果のチャンクの終わりに到達すると、次の 100 個の結果のチャンクはフェッチされず、イテレータが終了します。
fetchmanyが行をフェッチする結果セットが失われたかのようです。
を使用してシナリオを説明するには./manage.py shell
(連続した ID を持つ 40000 個の MyModel が存在すると仮定します)
上記は、期待どおりに 1 から 40000 までの ID を出力します。
上記は1から100までのIDのみを出力します
上記は1から200までのIDのみを出力します
obj.save
DB へのクエリを行う他のもの (例: ) に置き換えてもapp.models.OtherModel.objects.first()
、同じ結果が得られます。
クエリセットイテレータを使用しているときに別のクエリを作成することはできませんか? 同じことを達成する別の方法はありますか?
ありがとう