一次性将大量数据导入Google App Engine数据存储

3 投票
1 回答
883 浏览
提问于 2025-04-16 01:05

我有一个很大的CSV文件,大约10MB,里面包含了需要导入到Google App Engine的DataStore中的所有数据。 我尝试了几种方法来进行导入,但每次都在一半的时候失败了。

  • 第一种方法是通过将命令映射到网址,然后执行这个网址来导入,但因为请求超时而失败了……
  • 第二种方法是创建一个定时任务来导入,但遇到了DeadlineExceededError(超时错误)……
  • 第三种方法是使用远程API命令行,但也出现了操作超时的问题。

你能给我建议一个方法吗?(你可以想象用一些虚拟数据)这样我就能知道该怎么做……如果能提供一些代码示例,那就更好了。

** 我正在使用Python和谷歌的网络应用框架来开发这个应用。

1 个回答

4

你可以一行一行地上传数据,使用内置的批量加载工具。

http://code.google.com/appengine/docs/python/tools/uploadingdata.html

这是一篇不错的文章。

这里是我两年前用的 contactloader.py,供你参考。虽然现在比我上次用的时候更复杂了,但还是……

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

class Contact(db.Model):

    date = db.DateTimeProperty(auto_now_add=True)

    owner = db.StringProperty()

    companyname = db.StringProperty()

    companyemail = db.EmailProperty()

def myfunc(x):
    temp = x.split(":mailto:")
    if len(temp) > 0:
        temp = temp[-1].split(":")
    else:
        return "defaultvalue"
    if len(temp) > 0:
        temp = temp[0]
    else:
        return "defaultvalue"
    temp = temp.split("<1>")[0]
    if temp is None or len(temp) < 5:
        return "defaultvalue"
    return temp

def mysecfunc(x):
    return x.split("<0>")[0]

class ContactLoader(bulkloader.Loader):
    def __init__(self):
        bulkloader.Loader.__init__(self, 'Contact',
                                   [
                                    ('companyname',mysecfunc),
                                    ('owner', lambda x:"somevalue"),
                                    ('companyemail',myfunc),
                                    ("date",lambda x:datetime.datetime.now()),
                                   ])

loaders = [ContactLoader]

撰写回答