SQLAlchemy(1.1.0b3)とPostgresでFlaskアプリケーションを実行しています。SQLAlchemyで一時的にインクリメントを無効にする
Flaskでは、クライアントがタイプデータベースのすべてのインスタンスを取得し、Flaskアプリケーションのクリーンバージョンでそれらをローカルバックアップの方法で再度POSTすることができるAPIを提供します。クライアントがそれらを再び投稿するとき、彼らは彼らがそれらをダウンロードしたときと同じIDを再度持つべきです。
通常の操作でプライマリキーの「インクリメント」オプションを無効にしたくないのですが、クライアントがID付きのPOSTを提供していて、新しいリソースにIDを渡したい場合は、 SQLAlchemy。どのようにして現在のIDの最大値にアクセス/リセットできますか?
@app.route('/objects', methods = ['POST'])
def post_object():
if 'id' in request.json and MyObject.query.get(request.json['id']) is None: #1
object = MyObject()
object.id = request.json['id']
else: #2
object = MyObject()
object.fillFromJson(request.json)
db.session.add(object)
db.session.commit()
return jsonify(object.toDict()),201
ID #1
を持つオブジェクトの束を追加し、IDなしまたは使用されるID #2
での追加しようと、私が取得します。
duplicate key value violates unique constraint "object_pkey"
DETAIL: Key (id)=(2) already exists.
通常、idがincrementallyを生成しているが、そのIDが既に使用されている場合、そのための検査は行われません。自動インクリメントとINSERTをどうやって得ることができますか?
あなたはどんな問題を抱えていますか? Postgresでは、挿入中に主キー値を設定することができます。 – dirn
'session.add(object)'のように見えますが、 'object'がidを持たない場合、' session.add(object) 'がidなしで最後に呼び出されたときよりも大きなオブジェクトにidを与えます。 –
しかし、あなたが使用したいIDを持っているなら、それをセッションに追加する前にオブジェクトに割り当てるのはなぜですか? – dirn