sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur använder man PostgreSQL:s INSERT...ON CONFLICT (UPSERT)-funktion med flask_sqlalchemy?

Det visar sig att du kan köra en sats på lägre nivå på db.session . Så en lösning ser ut ungefär så här:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.postgresql import insert as pg_insert

app = Flask(__name__)
db = SQLAlchemy(app)

class MyTable(db.Model):
    id = db.Column(UUID, primary_key=True)
    data = db.Column(db.String)

    def __init__(self, _id, *args, **kwargs):
        self.id = _id
        self.data = kwargs['data']

    def as_dict(self):
        return {'id': self.id, 'data': self.data}

    def props_dict(self):
        d = self.as_dict()
        d.pop('id')
        return d

relation = MyTable(id=1, data='foo')
statement = pg_insert(MyTable)\.
    values(**relation.as_dict()).\
    on_conflict_do_update(constraint='id',
                          set_=relation.props_dict())

db.session.execute(statement)
db.session.commit()

as_dict() och props_dict() metoder i min modellklass tillåter mig att använda konstruktorn för att filtrera bort oönskade egenskaper från den inkommande HTTP-förfrågan.



  1. ignorerar mysql fulltext stoppord i frågan

  2. mysql-fråga VISA KOLUMNER FRÅN tabell som 'colmunname':questions

  3. Hur man får to_number att ignorera icke-numeriska värden

  4. Hur får man sökmotorer att indexera databasdrivet innehåll?