よく1つのトランザクションで2つのクエリを実行する必要があります。
最初に優先度を移動する@priority
は、挿入する予定のものです(1または何でもよい)。以下では、スタック全体を移動することを前提としています。それは意味をなさないでしょう。移動したい場合は "="に変更してください。それは同じだ錬金術で
BEGIN TRANSACTION
UPDATE tableName
SET ClientPriority = ClientPriority + 1
WHERE ClientPriority >= @priority
INSERT INTO tableName (feature, priority)
VALUES @feature, @priority
COMMIT TRANSACTION
だけ流暢 セッション=トランザクションあなたが良いそれを開いたらそう。 http://docs.sqlalchemy.org/en/latest/orm/session_transaction.html
tablename.update().where(ClientPriority>[email protected]). values(ClientPriority=ClientPriority+1)
tablename.insert.values([email protected], [email protected])
ニール・パテルのコメントから、最終的な解決策として、トリガーを追加:
@event.listens_for(RequestedFeatures, 'before_insert') def receive_before_insert(mapper, connection, target): query = "UPDATE features SET clientPriority = (clientPriority + 1) WHERE client = '" query += target.client + "' AND clientPriority >= " + str(target.clientPriority) qr = session.execute(query) session.commit()
そう、SQLでそれを処理することが可能である - トリガーを使用するが、それはデータベースで扱うべきではありません。データベースを使用するプログラムで処理する必要があります –
優先度の更新を実行する必要がありますか、最優先の行の下に表示する必要がありますか? –
コメントありがとう@ j.kaspar Guys。私はそれが存在する場合に基づいて優先順位をプッシュする必要があります! –