1

好的,我有相同的python代碼在本地和gae雲。令人費解的App引擎數據存儲問題(ListProperty)

當我在本地存儲實體,集合元素類型datetime.datetime的的ListProperty字段看起來像所以在數據存儲區查看器:

2009-01-01 00:00:00,2010-03-10 00:00:00 
當我存儲相同的雲

,觀看者將顯示:

[datetime.datetime(2009, 1, 1, 0, 0), datetime.datetime(2010, 3, 9, 0, 0)] 

爲什麼表示不同?

這不會打擾我,只有當我在雲上查詢這個字段查詢無法找到匹配的實體(它應該和它在本地) - 讓我相信這是不同的表示,導致麻煩。我應該重複 - 代碼是相同的。

任何人都認爲這是發生的原因和解決辦法嗎?

UPDATE: 我的查詢如下(使用過濾器):

from x import y 
from datetime import datetime 
from google.appengine.ext import db 

q = y.EntityType.all().filter('displayDateRange <=',datetime.now()).filter('displayDateRange >=',datetime.now()) 

usersResult = q.fetch(100) 
print `len(usersResult)` 

的結果應該是1,而不是它的0.1

其實它只是指定值的datetime.datetime那是的ListProperty問題 - 對StringListProperty的查詢在雲上按預期工作。

我試圖通過交互式控制檯在本地和雲和雲沒有結果的原始過濾器。所以它是一個數據存儲的東西,我假設它必須有事情做與存儲格式 - 我只有在與雙方的ListProperty一個數據存儲實體值看起來像:

2009-01-01 00:00:00,2010-03-09 00:00:00 
[datetime.datetime(2009, 1, 1, 0, 0), datetime.datetime(2010, 3, 9, 0, 0)] 

本地和雲分別。

任何想法?

此外更新

與硬編碼日期時間OBJ取代了datetime.now() - 例如過濾器現在看起來像:從2009年1月1日至3.9以上的日期時間的ListProperty範圍

y.EntityType.all().filter('displayDateRange <=',datetime(2009,11,24)).filter('displayDateRange >=',datetime(2009,11,24)) 

注.2010這應該返回上述實體 - 我在localhost dev服務器上嘗試了相同的過濾器,並且它是這樣做的。雲,它與datetime.datetime ListProperty的不同表示不會。

注意這是從current best practice for filtering on date range

任何想法採取了什麼地方出錯了?

回答

2

長話短說:它現在歸類爲應用程序引擎開發服務器版本中的一個錯誤,並且不再支持生產雲數據存儲。

填寫了進一步的解釋在blog post,檢查點3

1

在本地情況下,您看到的問題顯然是轉換爲字符串(稱爲__str____unicode__),而您的數據的表示(repr)顯示在雲上。但是,打印結果的這種差異不應該是您在雲上查詢失敗的原因。

什麼是您的確切查詢?

UPDATE知道查詢後:

我真的不明白爲什麼要使用這些過濾條件:

.filter('displayDateRange <=',datetime.now()).filter('displayDateRange >=',datetime.now()) 

有兩個問題:

  • 您可以撥打datetime.now()兩次,這可以給您不同的結果,這會導致一個空的結果集。在多線程/執行進程同時處於活動狀態的加載服務器上尤其如此。

  • 你可能打算用上面的一對過濾器來檢查是否相等。但如果由datetime.now()返回的日期時間實例的精度和存儲在數據庫中的日期時間的精度不同,則它將不起作用。通常在浮點數和亞秒精度時間值的情況下檢查相等性不是一個好主意。

你想用這樣一對過濾條件實現什麼?

+0

更新需要 – rutherford 2009-11-23 12:50:34

+0

有趣的 - 你谷歌應用程序引擎的經驗?這是對特定範圍內的日期進行過濾的推薦模式(ListProperty and equality test) - source:http://appengine-cookbook.appspot.com/attachment/?id=ahJhcHBlbmdpbmUtY29va2Jvb2tyEQsSCkF0dGFjaG1lbnQY0ygM – rutherford 2009-11-24 13:48:45

+0

儘管我承認2次調用datetime .now()是劣質的,會改變 – rutherford 2009-11-24 13:49:17