0

Я создаю систему заказов на Google App Engine.Google app engine ndb: не использовать один и тот же идентификатор

Предположим, я следующую модель заказа:

class Order(ndb.Model): 
    time: DateTimeProperty() 

дата плюс порядковый номер в виде строки используется как идентификатор одного объекта:

today = str(datetime.datetime.now())[:10].replace('-','') 
# Fetch today's orders 
orders = Order.query(...).order(-Order.time).fetch(1) 
if len(orders)==0: # No entities: today's first order 
    orderNum = today + '00001' 
else: 
    orderNum = str(int(orders[0].key.id())+1) 
order = Order(id=orderNum) 
order.date = datetime.datetime.now() 
order.put() 

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

Как сделать, чтобы такая ситуация не происходила?

ответ

1

Вы можете использовать что-то похожее на код ниже.

@ndb.transactional(retries=3) 
def create_order_if_not_exists(order): 
    exists = order.key.get() 

    if exists is not None: 
     raise Exception("Order already exists: ID=%s" % order.key.id()) 

    order.put() 

Или вы можете использовать метод класса с моделью get_or_insert() что транзакционно извлекает существующий объект или создает новый. См. Подробности here.

+0

Отлично! Большое спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^