當調用此POST方法時,我們仍然有重複條目的情況。 我曾詢問過有關堆棧溢出的建議,並給出solution,即利用parent/child
方法來保留強烈一致的查詢。複製高複製數據存儲中的條目
我已將所有數據遷移到該表單,並讓它再運行3個月。 但是問題從未解決。
問題是在這裏與這個條件if recordsdb.count() == 1:
它應該是爲了更新條目,而是HRD可能不會總是找到最新的條目,並創建一個新的條目。
正如你所看到的,我們正在編寫/通過父/子方法從記錄閱讀推薦:
new_record = FeelTrackerRecord(parent=user.key,...)
,但仍然進行檢索時,HRD仍然並不總是獲取最新的條目:
recordsdb = FeelTrackerRecord.query(ancestor = user.key).filter(FeelTrackerRecord.record_date == ...)
因此,我們很困擾這一點,不知道如何解決它。
@requires_auth
def post(self, ios_sync_timestamp):
user = User.query(User.email == request.authorization.username).fetch(1)[0]
if user:
json_records = request.json['records']
for json_record in json_records:
recordsdb = FeelTrackerRecord.query(ancestor = user.key).filter(FeelTrackerRecord.record_date == date_parser.parse(json_record['record_date']))
if recordsdb.count() == 1:
rec = recordsdb.fetch(1)[0]
if 'timestamp' in json_record:
if rec.timestamp < json_record['timestamp']:
rec.rating = json_record['rating']
rec.notes = json_record['notes']
rec.timestamp = json_record['timestamp']
rec.is_deleted = json_record['is_deleted']
rec.put()
elif recordsdb.count() == 0:
new_record = FeelTrackerRecord(parent=user.key,
user=user.key,
record_date = date_parser.parse(json_record['record_date']),
rating = json_record['rating'],
notes = json_record['notes'],
timestamp = json_record['timestamp'])
new_record.put()
else:
raise Exception('Got more than two records for the same record date - among REST post')
user.last_sync_timestamp = create_timestamp(datetime.datetime.today())
user.put()
return '', 201
else:
return '', 401
可能的解決方案:
的最後想法我就必須解決這個問題將是,辭去父/子策略路程,使用user.key
PLUS date-string
作爲關鍵的一部分。
保存:
new_record = FeelTrackerRecord(id=str(user.key) + json_record['record_date'], ...)
new_record.put()
加載:
key = ndb.Key(FeelTrackerRecord, str(user.key) + json_record['record_date'])
record = key.get();
現在我可以檢查是否記錄是無,我將創建一個新條目,否則我將更新它。希望HRD沒有理由不再找到記錄。 您認爲什麼,這是一個有保證的解決方案?
謝謝馬丁。我已經研究過你提供的鏈接。沒有示例代碼,我很難理解你的建議。在你提供的鏈接中,事務可以處理這種情況,因爲拋出了異常。在我的情況下,沒有例外。我獲取用戶的所有記錄並按日期過濾,即使該記錄應該存在,也找不到。因此它創建了一個新的記錄與該日期。沒有例外。交易如何解決這個問題? – Houman
感謝馬丁,如果我錯了,請糾正我,但我不認爲這是關於多個進程試圖同時保存。問題是在這一行罕見情況下找不到記錄'recordsdb = FeelTrackerRecord.query(ancestor = user.key).filter(FeelTrackerRecord.record_date == date_parser.parse(json_record ['record_date']))'因此它跳轉到'else if'語句並創建一條新記錄。那就是創建複製條目的時刻。它不是更新記錄,而是創建一個新記錄。我們不得不找到它沒有找到第一個記錄的原因嗎? – Houman
我明白你的意思,併爲此編輯2添加了一個建議。 –