Skip to content

Instantly share code, notes, and snippets.

@ronaldgreeff
Created July 1, 2019 15:51
Show Gist options
  • Save ronaldgreeff/d4ed253756c1f2d9e014cebf35e10a06 to your computer and use it in GitHub Desktop.
Save ronaldgreeff/d4ed253756c1f2d9e014cebf35e10a06 to your computer and use it in GitHub Desktop.
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment