ArrayField 的唯一索引,无论元素在其中的位置如何

问题描述 投票:0回答:2
class Marriage(BaseModel):
    users = ArrayField(BigIntegerField)
    chat_id = BigIntegerField()

    class Meta:
        indexes = (
            (('users', "chat_id"), True),
        )

我想为用户值和chat_id创建一个唯一索引,例如:

数据库中已经有这样一行:

users=[1,2], chat_id=1

我想在用户数组中创建相同但不同的位置。

users=[2,1], chat_id=1

我也需要这个“重复键值违规”才能工作,我该怎么做?

python python-3.x database postgresql peewee
2个回答
0
投票

我建议咨询 Postgres 人员,因为我不确定你会如何做。我认为“最好”的解决方案是将它们平放:

class Marriage(BaseModel):
    chat_id = pw.BigIntegerField()
    user_id = pw.BigIntegerField()
    class Meta:
        indexes = (
            (('chat_id', 'user_id'), True),
        )

for uid in (1, 2):
    Marriage.create(user_id=uid, chat_id=1)

然后让所有用户结婚:

q = Marriage.select(Marriage.user_id).where(Marriage.chat_id == 1)
uids = [uid for uid, in q.tuples()]

0
投票

在 Postgres 中,您创建一个 唯一索引 并使用 least()、great() 函数对 (user_id, chat_id) 的值进行排序,如下所示:(参见 demo

create unique  index chat_user_same_ndx 
    on marriage( least(chat_id, user_id), greatest(chat_id, user_id) );

我不确定这到底是如何转化为你的模糊语言的。但看看你如何在代码中创建索引似乎是可行的。

© www.soinside.com 2019 - 2024. All rights reserved.