2013-09-01 4 views
0

Массовая загрузка для объекта типа db.polymodel.PolyModel терпит неудачу из-за ошибки (мне удалось загрузить другие Сущности и весь импорт должен присутствовать):Массовая загрузка не работает для PolyModel в Appengine датасторе

[INFO ] Logging to bulkloader-log-20130901.191015 
[INFO ] Throttling transfers: 
[INFO ] Bandwidth: 250000 bytes/second 
[INFO ] HTTP connections: 8/second 
[INFO ] Entities inserted/fetched/modified: 20/second 
[INFO ] Batch Size: 10 
Traceback (most recent call last): 
    File "c:/program files (x86)/google/google_appengine/appcfg.py", line 171, in 
<module> 
    run_file(__file__, globals()) 
    File "c:/program files (x86)/google/google_appengine/appcfg.py", line 167, in 
run_file 
    execfile(script_path, globals_) 
    File "c:\program files (x86)\google\google_appengine\google\appengine\tools\ap 
pcfg.py", line 4252, in <module> 
    main(sys.argv) 
    File "c:\program files (x86)\google\google_appengine\google\appengine\tools\ap 
pcfg.py", line 4243, in main 
    result = AppCfgApp(argv).Run() 
    File "c:\program files (x86)\google\google_appengine\google\appengine\tools\ap 
pcfg.py", line 2402, in Run 
    self.action(self) 
    File "c:\program files (x86)\google\google_appengine\google\appengine\tools\ap 
pcfg.py", line 3979, in __call__ 
    return method() 
    File "c:\program files (x86)\google\google_appengine\google\appengine\tools\ap 
pcfg.py", line 3791, in PerformUpload 
    run_fn(args) 
    File "c:\program files (x86)\google\google_appengine\google\appengine\tools\ap 
pcfg.py", line 3682, in RunBulkloader 
    sys.exit(bulkloader.Run(arg_dict)) 
    File "c:\program files (x86)\google\google_appengine\google\appengine\tools\bu 
lkloader.py", line 4395, in Run 
    return _PerformBulkload(arg_dict) 
    File "c:\program files (x86)\google\google_appengine\google\appengine\tools\bu 
lkloader.py", line 4206, in _PerformBulkload 
    LoadConfig(config_file) 
    File "c:\program files (x86)\google\google_appengine\google\appengine\tools\bu 
lkloader.py", line 3873, in LoadConfig 
    Loader.RegisterLoader(cls()) 
    File "SubscribLoader.py", line 23, in __init__ 
    ('description', lambda x: x.decode('utf-8')), 
    File "c:\program files (x86)\google\google_appengine\google\appengine\tools\bu 
lkloader.py", line 2674, in __init__ 
    GetImplementationClass(kind) 
    File "c:\program files (x86)\google\google_appengine\google\appengine\tools\bu 
lkloader.py", line 968, in GetImplementationClass 
    implementation_class = db.class_for_kind(kind_or_class_key) 
    File "c:\program files (x86)\google\google_appengine\google\appengine\ext\db\_ 
_init__.py", line 296, in class_for_kind 
    raise KindError('No implementation for kind \'%s\'' % kind) 
google.appengine.ext.db.KindError: No implementation for kind 'DbSubscrib 

' Вот команда Line:

appcfg.py upload_data --config_file=SubscribLoader.py --filename=Subscrib.csv -- 
kind=(DbProduct,DbSubscrib) --url=https://.../_ah/remote_api -A appname 

Вот загрузчик класса

import datetime 
from google.appengine.tools import bulkloader 
from Db.shop.DbSubscrib import DbSubscrib 


class SubscribLoader (bulkloader.Loader): 
    def __init__(self): 
     bulkloader.Loader.__init__(self, ('DbProduct','DbSubscrib'), 
            [ 
            ('name', lambda x: x.decode('utf-8')), 
            ('createDate', 
            lambda x: datetime.datetime.strptime(x, '%m/%d/%Y').date()), 
            ('level', lambda x: x.decode('utf-8')), 
            ('duration', lambda x: x.decode('utf-8')), 
            ('service', lambda x: x.decode('utf-8')), 
            ('description', lambda x: x.decode('utf-8')), 
            ]) 

loaders = [SubscribLoader] 

DbSubcrib происходит от DbProduct, который управляет от polymodel.PolyModel

Btw, я пытался добавить еще дополнительное свойство «класс», который жёстко к DbSubscrib»(также пытался добавить 2 свойства„DbProduct“и„DbSubscrib“, без везения.

Любая помощь очень ценится. Я не мог найти документ на сайте goole, который затрагивает любые нюансы в PolyModel и bulkupload.

+0

Я использую polyodel (как в ndb, так и db), и нет основной проблемы с PolyModel с массовой загрузкой. Используете ли вы параметр «upload_data» - то есть все данные или массовый конфиг или выгрузка определенного типа, можете ли вы показать свою командную строку. –

+0

Добавлена ​​командная строка и пиктон uploader. Большое спасибо ! – user1055761

ответ

0

Хорошо, ваша проблема в том, что вы не можете загрузить DbSubScrib, вам нужно DbProduct. Если вы посмотрите на любой DbSubScrib, как она хранится в хранилище данных это DbProduct класс и подкласс будет иметь атрибут class в хранилище хранения имен классов наследования

например

class value: ["DbProduct", "DbSubScrib"] 

Chnage ваш класс загрузчика в DbProduct, и он будет работать.

+0

Да, но он создает DbProduct. Как мне сказать, чтобы создать DbSubscrib. Я попытался предоставить это в командной строке через -kind, тогда я попытался предоставить ему загрузчик .__ init__ (self, «DbSubscrib» .., а затем я попытался добавить «класс», lamda x: ['DbProduct ',' DbSubscrib '], .... Ни один из них не работал. Каждый раз, когда я получаю другую ошибку, я ищу способ создания подкласса PolyModel. Большое спасибо за ваш ответ! – user1055761

+0

Thats correct behavioyr. нужно понимать, как работает PolyModel. Все, что подклассы DbProduct хранятся как DbProduct. Когда вы используете класс DbSubscrib для извлечения вещей, он будет извлекать только объекты DbSubscrib, то есть с атрибутом класса, который содержит DbProduct и DbSubscrib. Посмотрите на свои объекты в хранилище данных viewer, то вы увидите, что происходит. –

+0

Я узнаю детали поведения PolyModel, включая точку с изложением и то, как она работает через дополнительный атрибут class/etc.То, что я ищу, это способ массовой загрузки объектов DbProduct, которые содержат правильное значение атрибута класса и другие атрибуты DbSubscrib. Мои файлы .Subscrib.csv имеют дополнительные атрибуты подкласса DbSubscrib. По сути, что мне нужно сделать (аргумент командной строки или модификации вышеописанного класса питона Python), так что он создает DbProduct с правильным значением класса и толкает детали значений атрибутов DbSubscrib из CSV. – user1055761

0

После небольшого переделания проблема была обнаружена в загрузчике google appengine: кажется, была попытка заставить работать с multipupload для PolyModel, но не уверен, почему эта часть не была исправлена ​​(или протестирована). Может быть, я что-то не хватает - в ANYCASE это работает для меня с этими изменениями ... Исправление в следующей строке google.appengine.tools.bulkloader.py:

class BulkTransporterApp(object): 
    """Class to wrap bulk transport application functionality.""" 

    def __init__(self, 

.... 
.... 


line 3399 - old -  self.kind = arg_dict['kind'] 

line 3399 - new - self.kind = ParseKind (arg_dict['kind']) 

После этого изменения я был в состоянии загрузить.

Я исправил модуль Bulkuploader и приведенную выше командную строку для того, как следует загружать PolyModel.

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