Я использую библиотеку Peewee в Python и хочу проверить, существует ли запрос. Я не хочу создавать запись, если она не существует, поэтому я не хочу использовать get_or_create. Должно быть лучшее решение, чем использовать try/except с get, но я ничего не вижу. Пожалуйста, дайте мне знать, если есть лучший способ. Спасибо.
проверить, существует ли запрос, используя peewee
Ответы (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
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
В качестве альтернативы, если вы хотите проверить, например, какая-то другая таблица ссылается на эту запись, вы можете использовать предложение 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
). Не уверен, что такая оптимизация действительно требуется.