2010-05-12 38 views
0

这似乎为42,200〜记录运行,那么失败:AppEngine上的Python批量出口错误

import datetime 
import time 

from google.appengine.ext import db 
from google.appengine.tools import bulkloader 
from google.appengine.api import datastore_types 

class SearchRec(db.Model): 
    WebSite = db.StringProperty() 
    WebPage = db.StringProperty() 
    DateStamp = db.DateTimeProperty(auto_now_add=True) 
    IP = db.StringProperty() 
    UserAgent = db.StringProperty() 


class TrackerExporter(bulkloader.Exporter): 
    def __init__(self): 
     bulkloader.Exporter.__init__(self, 'SearchRec', 
            [('WebSite', str, None), 
            ('WebPage', str, None), 
            ('DateStamp', lambda x: str(datetime.datetime.strptime(x, '%d/%m/%Y').date()), None), 
            ('IP', str, None) 
            ]) 

exporters = [TrackerExporter] 

if __name__ == '__main__': 
    bulkload.main(TrackerExporter) 

错误:

File "tracker-export.py", line 89, in <lambda> 
     ('DateStamp', lambda x: str(datetime.datetime.strptime(x, '%d/%m/%Y').date() 
    ), None), 

TypeError: strptime() argument 1 must be string, not datetime.datetime 
+0

您是否在过去某个时间点的db.StringProperty和db.DatetimeProperty之间的某个点更改了模型的定义? – geoffspear 2010-05-12 18:06:50

+0

我做到了,但是我把所有的数据都抛弃了(直到模型消失),所以不应该影响它。 – 2010-05-12 19:32:05

回答

1

我不知道到底为什么会发生。我对App Engine的批量导出设施不太熟悉,但听起来像DateStamp字段正在作为字符串(这是您的转换器期望的)向批量导出器提供第42200条记录,然后对于某些原因,它是作为一个真实的datetime.datetime对象给出的。

不管怎么说,这是这个特定症状治疗:

lambda x: str((x if isinstance(x, datetime.datetime) else datetime.datetime.strptime(x, '%d/%m/%Y')).date()) 

如果给一个字符串或datetime.datetime对象应该做正确的事。这可能是一种情况,你应该给它一个专门的功能,而不是折磨这样的lambda

+0

不得不轻笑;折磨一个拉姆达;)...我有一个函数根据另一个网站上的文章,但当这导致了同样的错误,我回到了这一点。有一天,谷歌将停止努力工作:) – 2010-05-12 18:39:52