SQLAlchemy update PostgreSQL array using merge not work

后端 未结 2 1224
悲&欢浪女
悲&欢浪女 2020-12-11 20:30

I\'m using SQLAlchemy to access PostgreSQL database, and I defined the object like this:

class SessionLog(Base):
    __tablename__ = \'session_log\'

    id          


        
2条回答
  •  旧时难觅i
    2020-12-11 21:09

    Found this gist which helped me a lot. I added a custom __setitem__ to be able to change an item in the list, and __delitem__ to delete one:

    from sqlalchemy.ext.mutable import Mutable
    from sqlalchemy.dialects.postgresql import ARRAY
    
    class MutableList(Mutable, list):
    
        def __setitem__(self, key, value):
            list.__setitem__(self, key, value)
            self.changed()
    
        def __delitem__(self, key):
            list.__delitem__(self, key)
            self.changed()
    
        def append(self, value):
            list.append(self, value)
            self.changed()
    
        def pop(self, index=0):
            value = list.pop(self, index)
            self.changed()
            return value
    
        @classmethod
        def coerce(cls, key, value):
            if not isinstance(value, MutableList):
                if isinstance(value, list):
                    return MutableList(value)
                return Mutable.coerce(key, value)
            else:
                return value
    

    Then in your model:

    your_field = db.Column(
        MutableList.as_mutable(ARRAY(db.String())),
        server_default="{}"
    )
    

提交回复
热议问题