SQLAlchemy ON DUPLICATE KEY UPDATE

前端 未结 9 1611
死守一世寂寞
死守一世寂寞 2020-11-27 15:53

Is there an elegant way to do an INSERT ... ON DUPLICATE KEY UPDATE in SQLAlchemy? I mean something with a syntax similar to inserter.insert().execute(lis

9条回答
  •  伪装坚强ぢ
    2020-11-27 16:28

    My way

    import typing
    from datetime import datetime
    from sqlalchemy.dialects import mysql
    
    class MyRepository:
    
        def model(self):
            return MySqlAlchemyModel
    
        def upsert(self, data: typing.List[typing.Dict]):
            if not data:
                return
            model = self.model()
            if hasattr(model, 'created_at'):
                for item in data:
                    item['created_at'] = datetime.now()
    
            stmt = mysql.insert(getattr(model, '__table__')).values(data)
            for_update = []
            for k, v in data[0].items():
                for_update.append(k)
    
            dup = {k: getattr(stmt.inserted, k) for k in for_update}
            stmt = stmt.on_duplicate_key_update(**dup)
            self.db.session.execute(stmt)
            self.db.session.commit()
    

    Usage:

    myrepo.upsert([
        {
            "field11": "value11",
            "field21": "value21",
            "field31": "value31",
        },
        {
            "field12": "value12",
            "field22": "value22",
            "field32": "value32",
        },
    ])
    

提交回复
热议问题