PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да използвам функцията INSERT...ON CONFLICT (UPSERT) на PostgreSQL с flask_sqlalchemy?

Оказва се, че можете да изпълните оператор от по-ниско ниво на db.session . Така че решението изглежда по следния начин:

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() и props_dict() методи в моя модел клас ми позволяват да използвам конструктора за филтриране на нежелани свойства от входящата HTTP заявка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да не създавате разширения PostgreSQL 9.0 на RPM платформи

  2. Изтриванията на PostgresSql 9.6 изведнъж станаха бавни

  3. PostgreSQL и nodejs/pg, връщат вложен JSON

  4. Django:Кои са най-добрите практики за мигриране на проект от sqlite към PostgreSQL

  5. Postgres избира текущи данни за час