通过CSV批量上传Google App Engine数据存储区

时间:2013-05-28 13:33:36

标签: google-app-engine google-cloud-datastore

我正在使用Python构建GAE webapp。我也在使用数据存储区,并尝试使用终端和CSV文件批量上传数据到数据库:

https://developers.google.com/appengine/docs/python/tools/uploadingdata

我在app根目录下的separate.py文件中创建了一个Loader类。我不确定这个加载器类应该在我的main.py webapp文件中,还是在根目录中的另一个文件中。

Loader class:

import datetime
from google.appengine.ext import db
from google.appengine.tools import bulkloader
import models


class FTSELoader(bulkloader.Loader):
    def __init__(self):
        bulkloader.Loader.__init__(self, 'FTSE',
                               [('date', lambda x: datetime.datetime.strptime(x, '%Y/%m/%d')),                                 
                               ('close', float)])
loaders = [FTSELoader]

我尝试创建/上传的那种类(即我的数据存储表)称为“FTSE”。然后我在终端中运行此命令:

appcfg.py upload_data --config_file=FTSEdataloader.py --filename=FTSEdata.csv --      kind=FTSE --url=http://<myapp.appspot.com>/_ah/remote_api

我收到以下错误:

文件“FTSEdataloader.py”,第4行,in     进口车型 ImportError:没有名为models

的模块

我没有GAE演示中的“models.py”。应该取而代之的是什么?

由于

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。我不确定为什么appcfg.py在运行上传脚本时找不到模型模块。我通过这样做解决了这个问题:

import datetime
from google.appengine.ext import db
from google.appengine.tools import bulkloader

class FTSE(db.Model):
    date = DateTimeProperty()
    close = FloatProperty()

class FTSELoader(bulkloader.Loader):
    def __init__(self):
        bulkloader.Loader.__init__(self, 'FTSE',
                           [('date', lambda x: datetime.datetime.strptime(x, '%Y/%m/%d')),                                 
                           ('close', float)])
loaders = [FTSELoader]

基本上它只是将您的模型定义放在bulkloader中。它当然不是最好的方法,但它可以解决appcfg.py在运行批量上传时似乎遇到的PYTHONPATH问题。

答案 1 :(得分:0)

您可以使用Python代码文件执行此操作。该文件为正在创建的实体导入或定义Model类,为您要导入的每种类型定义一个加载器类,并在全局变量中声明可用的加载器类。

例如,假设您在名为models.py的文件中定义了一个名为“FTSE”的Model类(它位于您的PYTHON PATH中,例如您将运行该工具的目录Ex:C:\ Python27)类似于以下内容:

models.py

from google.appengine.ext import db

class FTSE(db.Model):
   date = db.DateProperty()
   close = db.FloatProperty()