INSERT
のPostgreSQL ON CONFLICT
節は、「upsert」機能を提供します(つまり、既存のレコードを更新するか、またはそのようなレコードが存在しない場合は新しいレコードを挿入します)。この機能は、(説明hereなど)PostgreSQLの方言のInsert
オブジェクト上on_conflict_do_nothing
とon_conflict_do_update
方法を経由してSQLAlchemyの中でサポートされています。私はあなたのためのSQLAlchemyののエンジン、セッション、および接続を管理flask_sqlalchemy
を、使用していますflask_sqlalchemyでPostgreSQLの「INSERT ... ON CONFLICT」(UPSERT)機能を使用するにはどうすればよいですか?
from sqlalchemy.dialects.postgresql import insert
insert_stmt = insert(my_table).values(
id='some_existing_id',
data='inserted value'
)
do_nothing_stmt = insert_stmt.on_conflict_do_nothing(
index_elements=['id']
)
conn.execute(do_nothing_stmt)
do_update_stmt = insert_stmt.on_conflict_do_update(
constraint='pk_my_table',
set_=dict(data='updated value')
)
conn.execute(do_update_stmt)
。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
class MyTable(db.Model):
id = db.Column(UUID, primary_key=True)
data = db.Column(db.String)
relation = MyTable(id=1, data='foo')
db.session.add(relation)
db.session.commit()
のでInsert
オブジェクトが完全に包まれ、flask_sqlalchemy
によって隠されている:データベースに要素を追加するには、私は、このような何かを、私のモデルのインスタンスを作成し、データベースのセッションにそれを追加し、コミット呼び出し。
アップサンプリングを実行するためにPostgreSQL固有の方言メソッドにアクセスするにはどうすればよいですか? flask_sqlalchemy
をバイパスして自分のセッションを作成する必要がありますか?私がこれを行うと、どのようにして競合が起こらないようにすることができますか?