У меня есть следующая модель peewee (упрощенно):
class Foo(BaseModel):
a = IntegerField() # actually a ForeignKey
b = IntegerField(null=True) # ForeignKey
c = IntegerField(null=True) # ForeignKey
d = TextField()
e = TextField(null=True)
Я хочу создать уникальный индекс для полей (a, b, c, d), считая значения NULL равными.Например, должна быть возможность вставить (1, NULL, NULL, 2, NULL) только один раз.
Мне удалось написать необработанный SQL-запрос для добавления индекса (-1 должно быть безопасно, так как b и cесть внешние ключи для int> 0)
CapsuleTranslatorBundle.add_index(SQL('''CREATE UNIQUE INDEX foo_idx ON foo (
a, # a_id if a is a foreign key
COALESCE(b, -1),
COALESCE(c, -1),
d
);
'''))
Я пытался
idx = Foo.index(Foo.a,
fn.COALESCE(Foo.b, -1),
fn.COALESCE(Foo.c, -1),
Foo.d, unique=True)
Foo.add_index(idx)
, но получил
peewee.OperationalError: near "USING": syntax error
Как добавить индекс без использования необработанного SQL?