проверить, существует ли запрос, используя peewee

Я использую библиотеку Peewee в Python и хочу проверить, существует ли запрос. Я не хочу создавать запись, если она не существует, поэтому я не хочу использовать get_or_create. Должно быть лучшее решение, чем использовать try/except с get, но я ничего не вижу. Пожалуйста, дайте мне знать, если есть лучший способ. Спасибо.


person calthoff    schedule 30.07.2015    source источник
comment
Что-то не так с подходом try/except?   -  person taesu    schedule 30.07.2015
comment
Выглядит не очень элегантно.   -  person calthoff    schedule 30.07.2015


Ответы (3)


Вы можете использовать .exists():

query = User.select().where(User.username == 'charlie')
if query.exists():
    # A user named "charlie" exists.
    cool()

http://docs.peewee-orm.com/en/latest/peewee/api.html?highlight=exists#SelectBase.exists

person coleifer    schedule 30.07.2015
comment
Если я использую db.atomic() для получения или создания нескольких связанных записей в рамках одной транзакции (т. е. не использую функцию get_or_create() для каждой записи), что, по вашему мнению, лучше использовать — try/except или exists() ? - person ron_g; 22.10.2019

Если вам просто нужно проверить существование, используйте принятый ответ.

Если вы собираетесь использовать запись, если она существует, вы можете использовать Model.get_or_none(), так как это устраняет необходимость использования try/catch и не создает запись, если запись не существует.

class User(peewee.Model):
    username = peewee.CharField(unique=True)

user = User.get_or_none(username='charlie')
if user is not None:
    # found user, do something with it
    pass
person Weston    schedule 28.05.2019
comment
Меня удивили отрицательные голоса, поэтому я уточнил свой ответ. Мое прочтение вопроса показало, что они хотели что-то сделать с объектом, если он существовал. Какой вопрос у меня был, когда я наткнулся на этот вопрос. - person Weston; 21.10.2019

В качестве альтернативы, если вы хотите проверить, например, какая-то другая таблица ссылается на эту запись, вы можете использовать предложение WHERE EXISTS (subquery). Он изначально не поддерживается PeeWee, но его можно легко сконструировать:

subquery = Child.select(Param('1')).where(Child.parent == Parent.id)
parents_with_children = Parent.select().where(
    Clause(SQL('EXISTS'), subquery))

Это эквивалентно следующему SQL:

SELECT * FROM parent
WHERE EXISTS (SELECT 1 FROM child
              WHERE child.parent_id = parent.id);

Здесь я использовал SELECT 1 для подзапроса, чтобы избежать получения ненужной информации (например, child.id). Не уверен, что такая оптимизация действительно требуется.

person MarSoft    schedule 13.04.2016