0

まず、これは SQLAlchemy を使用する初めてのプロジェクトなので、まだかなり初心者です。

GTFS データを操作するシステムを作成しています。データを非常に効率的にクエリできると思われるバックエンドがあります。

私がやろうとしているのは、GTFS ファイルがデータベースを新しいデータで更新できるようにすることです。私が直面している問題は明らかです。挿入しようとしているデータが既にデータベースにある場合、主キーの一意性に関して競合が発生します。

効率的な理由から、挿入に次のコードを使用することにしました。ここで、model はデータを挿入するモデル オブジェクトであり、data は挿入する辞書の事前計算されたクリーンなリストです。

 for chunk in [data[i:i+chunk_size] for i in xrange(0, len(data), chunk_size)]:
    engine.execute(model.__table__.insert(),chunk)

思いつく解決策は 2 つあります。

  1. 衝突があっても気にせず、失敗しないように、挿入を行う方法を見つけました。上記のコードはTableClauseを使用していると思われるので、最初にそこをチェックして、適切な代替またはフラグを見つけることを望んでいましたが、うまくいきませんでした。

  2. データのクリーニングを実行する前に、主キー値のリストを取得し、特定の要素が主キーで一致する場合は、値のクリーニングと挿入をスキップします。Table.primary_keyから PrimaryKeyConstraint を取得できたことがわかりましたが、列を取得したり、特定の列 (私の場合は主キー) のみを照会する方法を見つけたりすることはできません。

私がそれを行う方法を見つけることができれば、どちらでも十分なはずです。

過去数時間、これらの両方を調べた後、どちらも見つからないようです。誰かが以前にこれを行って、正しい方向に向けてくれることを願っていました。

よろしくお願いします。

更新 1 : 上記で言及しなかった 3 番目のオプションがあります。つまり、データベースからすべてのデータを削除して、再挿入します。小さな GTFS ファイルであっても、何十万もの要素を簡単に挿入でき、これを実行するには約 30 分かかるようです。アップデート用。

4

1 に答える 1

1

SQLAlchemy を使用すると、モデル クラスの新しいインスタンスを作成し、それを現在のセッションにマージするだけです。SQLAlchemy は、(キャッシュまたはデータベースから) このオブジェクトを既に認識しているかどうかを検出し、必要に応じてデータベースに新しい行を追加します。

newentry = model(chunk)
session.merge(newentry)

コンテキストについては、この質問も参照してください: SQLAlchemy に存在しない場合にオブジェクトを挿入する最速の方法

于 2012-09-16T20:39:51.040 に答える