name = CharField(unique=True)
class Meta:
database = db
with db:
Person.create_table()
firsty = Person(name='Johny Depp').save()
если дважды попробовать записать Джонни Деппа, в этом случае получаю ошибку:
peewee.IntegrityError: UNIQUE constraint failed: person.name
оно то и понятно... уникальный name, все дела. Вопрос:
как сделать что-то типа если уже записано - игнорируй
?
Лови исключения своей базы, либо peewee и делай rollback except peewee.IntegrityError: db.rollback() Так же советую почитать про транзакции https://docs.peewee-orm.com/en/3.4.0/peewee/transactions.html
то есть, у пиви нет ничего подобному этому? INSERT OR IGNORE INTO t (name) VALUES ('a') UPD: Кажется я нашёл то, что мне нужно: firsty = Person.get_or_create(name='John1y Depp') в этом случае не возникает никаких ошибок. Но использую ли я .get_or_create по назначению?
Да, есть get_or_create(**kwargs) но здесь у тебя выполняется сначала select, если значение отсутствует, то выполняется insert. Обычно используется, если надо получить значение, но в случае отсутствия, создать его.
и чтобы посоветовал делать? юзать get or create или ловить исключения?
Если тебе нужно только создавать записи, то только ловил бы исключения. Например для postgres можно более точную ошибку ловить по коду ошибки и логировать, либо оповещать пользоваться о причинах. Если ты дальше в коде работаешь с этой записью, то использовал бы get_or_create.
хмм... Будет над чем подумать благодарю за инфу 🤝
Если ты сделаешь функцию например add_new_user будет не логично, если ты будешь получать значение, а не сообщать, что пользователь уже существует)
Тут вот в чем штука: Будет база данных с ID, допустим фильмов. Пользователи смогут добавлять id фильмов в эту базу. То есть, получается, что например 10 разных пользователей могут добавить один и тот же id в базу.
Обсуждают сегодня