我遇到了这个问题。我使用的解决方案是创建一个从sqlalchemy.ext.mutable.Mutable 和set 继承的类型,然后将其包装在由sqlalchemy.dialects.postgresql.ARRAY 支持的类型中。
from sqlalchemy.ext.mutable import Mutable
from sqlalchemy.dialects.postgresql import ARRAY
modmethods = ['add', 'clear', 'difference_update', 'discard',
'intersection_update', 'pop', 'remove',
'symmetric_difference_update', 'update',
'__ior__', '__iand__', '__isub__', '__ixor__']
class MutableSet(Mutable, set):
@classmethod
def coerce(cls, key, value):
if not isinstance(value, cls):
return cls(value)
else:
return value
def _make_mm(mmname):
def mm(self, *args, **kwargs):
try:
retval = getattr(set, mmname)(self, *args, **kwargs)
finally:
self.changed()
return retval
return mm
for m in modmethods:
setattr(MutableSet, m, _make_mm(m))
del modmethods, _make_mm
def ArraySet(_type, dimensions=1):
return MutableSet.as_mutable(ARRAY(_type, dimensions=dimensions))
这会覆盖set 的方法,这些方法可以通过添加对Mutable 的changed 方法的调用来更改集合的值,从而导致SQLAlchemy 将可能更改的值刷新到数据库中。
然后,您在 SQLAlchemy 中声明此类型,并使用其中的类型;例如,将其声明为一组整数:
Column(ArraySet(Integer))
然后,当你使用它时,你可以像对待一个标准的 Python 集合一样对待这个值,所有的操作符和方法都不变。