我曾经遇到过完全相同的问题。我的解决方法是创建一个继承自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))
这将覆盖可以通过添加对
Mutable
的
changed
方法的调用来更改集合值的
set
方法,导致SQLAlchemy将可能已更改的值刷新到数据库。
然后,在SQLAlchemy中使用将位于其中的类型声明此类型;例如,将其声明为整数集合:
Column(ArraySet(Integer))
然后,当您使用它时,您可以像标准的Python set一样处理该值,所有运算符和方法都不变。