Python 为什么peewee在这种多对多关系中失败了?peewee.IntegrityError:通过表的唯一约束失败

Python 为什么peewee在这种多对多关系中失败了?peewee.IntegrityError:通过表的唯一约束失败,python,many-to-many,peewee,Python,Many To Many,Peewee,我正在从网页中提取数据。“块”表示给定页面上的文本块或图像块。我提取该块的选择器列表。选择器(对象)有一个类列表(SelecClass对象)。选择器对象可能有许多SelecClass对象,而SelecClass对象可能存在于其他选择器中。因此,我将选择器和SelecClass对象之间的关系作为多对多关系存储在直通表中 但是,当存在重复的SelecClass值时,我会得到: peewee.IntegrityError: UNIQUE constraint failed: selecclass_se

我正在从网页中提取数据。“块”表示给定页面上的文本块或图像块。我提取该块的选择器列表。选择器(对象)有一个类列表(SelecClass对象)。选择器对象可能有许多SelecClass对象,而SelecClass对象可能存在于其他选择器中。因此,我将选择器和SelecClass对象之间的关系作为多对多关系存储在直通表中

但是,当存在重复的SelecClass值时,我会得到:

peewee.IntegrityError: UNIQUE constraint failed: selecclass_selector_through.selecclass_id, selecclass_selector_through.selector_id
我不明白为什么。因为它是一个直通表,所以我希望有重复的选择器ID和SelecClass ID。我误解了吗

如果是,我如何解决这个问题?我已尝试在ManyToManyField上设置“unique=False”,但无法识别该参数

如果已安装peewee,则可以在本地运行以下代码以复制错误

from peewee import *

if __name__ == '__main__':

    # DATABASE SETUP
    database = SqliteDatabase('test_db.db')

    class BaseModel(Model):
        class Meta:
            database = database


    class Block(BaseModel):
        text = TextField(null=True)


    class SelectorID(BaseModel):
        name = CharField(unique=True)

    class SelectorName(BaseModel):
        name = CharField(unique=True)

    class Selector(BaseModel):
        block = ForeignKeyField(Block, backref='selectors')
        selector_id = ForeignKeyField(SelectorID, backref='selectors')
        name = ForeignKeyField(SelectorName, backref='selectors')

    class SelecClass(BaseModel):
        selectors = ManyToManyField(Selector, backref='selector_classes')
        name = CharField(unique=True)

    def create_tables():
        database.connect()
        with database:
            database.create_tables([Block,
                SelectorID, SelectorName, Selector,
                SelecClass,
                SelecClass.selectors.get_through_model()])
        database.close()

    create_tables()


    # DATA
    block = {'text': 'test'}
    selectors = [
        {
            "classes": [
                "wrapper"
            ],
            "id": "",
            "name": "div"
        },
        {
            "classes": [
                "row"
            ],
            "id": "",
            "name": "div"
        },
        {
            "classes": [
                "row" # When I try to insert this selector's class_obj, a duplicate, I get an IntegrityError
            ],
            "id": "",
            "name": "div"
        },
    ]


    # DATA INSERT
    block_object = Block.create(text=block['text'])

    selectors_and_classes = []

    with database.atomic():

        for selector in selectors:

            selector_id, _ = SelectorID.get_or_create(name=selector['id'])
            selector_name, _ = SelectorName.get_or_create(name=selector['name'])

            selector_obj = Selector.create(
                block=block_object,
                selector_id=selector_id,
                name=selector_name,
                )

            s2bc_class_objs = []

            for s2bc_class in selector['classes']:
                selector_class_obj, _ = SelecClass.get_or_create(name=s2bc_class)

                s2bc_class_objs.append(selector_class_obj)

            selectors_and_classes.append((selector_obj, s2bc_class_objs))


    with database.atomic():

        for selector_and_classes in selectors_and_classes:

            selector = selector_and_classes[0]
            selector_class_objs = selector_and_classes[1]

            Selector = Selector.get(selector_obj)

            for class_obj in selector_class_objs:
                Selector.selector_classes.add(class_obj)
回溯:

Traceback (most recent call last):
  File "C:\h\envs\mlpc\lib\site-packages\peewee.py", line 2936, in execute_sql
    cursor.execute(sql, params or ())
sqlite3.IntegrityError: UNIQUE constraint failed: selecclass_selector_through.selecclass_id, selecclass_selector_through.selector_id

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 108, in <module>
    Selector.selector_classes.add(class_obj)
  File "C:\h\envs\mlpc\lib\site-packages\peewee.py", line 6810, in add
    accessor.through_model.insert_many(inserts).execute()
  File "C:\h\envs\mlpc\lib\site-packages\peewee.py", line 1778, in inner
    return method(self, database, *args, **kwargs)
  File "C:\h\envs\mlpc\lib\site-packages\peewee.py", line 1849, in execute
    return self._execute(database)
  File "C:\h\envs\mlpc\lib\site-packages\peewee.py", line 2567, in _execute
    return super(Insert, self)._execute(database)
  File "C:\h\envs\mlpc\lib\site-packages\peewee.py", line 2316, in _execute
    cursor = database.execute(self)
  File "C:\h\envs\mlpc\lib\site-packages\peewee.py", line 2949, in execute
    return self.execute_sql(sql, params, commit=commit)
  File "C:\h\envs\mlpc\lib\site-packages\peewee.py", line 2943, in execute_sql
    self.commit()
  File "C:\h\envs\mlpc\lib\site-packages\peewee.py", line 2725, in __exit__
    reraise(new_type, new_type(*exc_args), traceback)
  File "C:\h\envs\mlpc\lib\site-packages\peewee.py", line 183, in reraise
    raise value.with_traceback(tb)
  File "C:\h\envs\mlpc\lib\site-packages\peewee.py", line 2936, in execute_sql
    cursor.execute(sql, params or ())
peewee.IntegrityError: UNIQUE constraint failed: selecclass_selector_through.selecclass_id, selecclass_selector_through.selector_id
回溯(最近一次呼叫最后一次):
文件“C:\h\envs\mlpc\lib\site packages\peewee.py”,第2936行,在execute\U sql中
execute(sql、params或())
sqlite3.IntegrityError:唯一约束失败:SELEClass\u selector\u至.SELEClass\u id,SELEClass\u selector\u至.selector\u id
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“test.py”,第108行,在
选择器.Selector_classes.add(class_obj)
文件“C:\h\envs\mlpc\lib\site packages\peewee.py”,第6810行,添加
accessor.through_model.insert_many(inserts).execute()
文件“C:\h\envs\mlpc\lib\site packages\peewee.py”,第1778行,在内部
返回方法(self、数据库、*args、**kwargs)
文件“C:\h\envs\mlpc\lib\site packages\peewee.py”,第1849行,在execute中
返回self.\u执行(数据库)
文件“C:\h\envs\mlpc\lib\site packages\peewee.py”,第2567行,在执行中
返回超级(插入,自).\u执行(数据库)
文件“C:\h\envs\mlpc\lib\site packages\peewee.py”,第2316行,在执行中
cursor=database.execute(self)
文件“C:\h\envs\mlpc\lib\site packages\peewee.py”,第2949行,在execute中
返回self.execute_sql(sql,参数,commit=commit)
文件“C:\h\envs\mlpc\lib\site packages\peewee.py”,第2943行,在execute\U sql中
self.commit()
文件“C:\h\envs\mlpc\lib\site packages\peewee.py”,第2725行,在退出时__
重新发布(新类型,新类型(*exc_参数),回溯)
文件“C:\h\envs\mlpc\lib\site packages\peewee.py”,第183行,在reraise中
通过_回溯(tb)提升值
文件“C:\h\envs\mlpc\lib\site packages\peewee.py”,第2936行,在execute\U sql中
execute(sql、params或())
peewee.IntegrityError:唯一约束失败:SELEClass\u selector\u至.SELEClass\u id,SELEClass\u selector\u至.selector\u id
我知道错误的意思,我只是不明白为什么我会得到它(在一个我认为可以接受重复的直通表上),或者如何改变它