Appengine Python Bulk Export error - PullRequest
0 голосов
/ 12 мая 2010

Похоже, что это работает для ~ 42 200 записей, затем происходит сбой:

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

1 Ответ

1 голос
/ 12 мая 2010

Я не уверен, почему именно это будет происходить. Я не слишком знаком со средствами массового экспорта в 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 как этот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...