Как я могу проверить, существует ли запись с определенным именем ключа в хранилище данных? - PullRequest
1 голос
/ 16 октября 2011

Мне нужно добавить продукты в мое хранилище данных.В случае, если продукт уже существует, мне нужно назначить другой key_name.Допустим, у меня уже есть: product = MyDBModelProduct (key_name = 'milk'), теперь, когда я добавляю другие продукты (снова молоко), мне нужно добавить их с именами ключей milk-1, milk-2, milk-3 и т. Д.,Поэтому, прежде чем добавлять новую запись в БД, мне нужно проверить, есть ли там молоко.Я вижу 3 возможных способа сделать это:

(1) GqlQuery использование:

proposed_key_name = 'milk'
product = db.GqlQuery("SELECT * FROM MyDBModelProduct WHERE key_name = :1 LIMIT 1", proposed_key_name).fetch(1)
if (len(product) > 0): # can not use this name, should look for milk-2, milk-3...

(2) all использование:

query = MyDBModelProduct.all()
count = query.filter('key_name =', proposed_key_name).count()

(3) get_by_key_name использование:

id_key_name = proposed_key_name
id_count = 1
while MyDBModelProduct.get_by_key_name(id_key_name) is not None:
    id_key_name = proposed_key_name + '-' + id_count
    id_count += 1

Каков наилучший подход?Какой из них будет работать быстрее?

1 Ответ

3 голосов
/ 17 октября 2011

Опции 1 и 2 идентичны. Ни один из них не будет работать, потому что key_name не является допустимым фильтром - вместо этого вам нужно создать полностью определенный ключ и запросить его - например, .filter('__key__ =', my_key). Вам также следует выполнить запрос только по ключам - SELECT __key__ или MyDBModelProduct.all(keys_only=True), поскольку вам не нужен фактический объект модели.

Число 3 быстрее, чем 1 и 2, как они есть, но если вы измените запрос, как описано выше, 1 или 2 быстрее. Если вам нужно сделать это оптом, get / get_by_key_name поддерживает пакетные операции, а Query - нет.

Однако предлагаемое вами использование вызывает недоумение - весь смысл имен ключей состоит в том, чтобы использовать естественный ключ, имеющий какое-то внешнее значение, но вы изобретаете новые в зависимости от того, используется ли уже существующий.

...