GAE在不使用CSV的情况下加载数据到datastore

1 投票
2 回答
751 浏览
提问于 2025-04-15 14:19

我之前用过bulkloader.Loader这个工具,把数据批量加载到GAE的开发和实际数据库里。接下来我想做的是,从不是CSV格式的数据中创建对象,然后把它们放进数据库。

假设我的对象长得像这样:

class CainEvent(db.Model):   
    name =db.StringProperty(required=True)  
    birthdate = db.DateProperty()

有没有人能给我一个简单的例子,教我怎么做呢?

2 个回答

0

你可能会觉得这篇文章很有用——它详细讲解了如何直接从关系型数据库(RDBMS)加载数据,不过同样的方法也适用于从其他任何来源加载数据。

2

这里有一个非常简单的例子,说明我们是如何使用批量加载器来加载JSON数据,而不是CSV数据的:

class JSONLoader(bulkloader.Loader):
    def generate_records(self, filename):
        for item in json.load(open(filename)):
            yield item['fields']

在这个例子中,我假设JSON的格式大概是这样的:

[
    {
        "fields": [
            "a", 
            "b", 
            "c", 
            "d"
        ]
    }, 
    {
        "fields": [
            "e", 
            "f", 
            "g", 
            "h"
        ]
    }
]

这个格式其实是简化过的。

基本上,你只需要创建一个批量加载器的子类,并实现一个叫做 generate_records 的方法,至少要让这个方法返回字符串的列表。用同样的方法,你也可以从XML文件、ROT13加密文件或者其他任何格式的数据中加载数据。

需要注意的是,generate_records 方法返回的字符串列表,必须和你在初始化加载器时提供的“属性”列表在长度和顺序上匹配(也就是说,在 AlbumLoader.__init__ 方法中,第二个参数的内容要一致,具体可以参考这个例子)。

这种方法其实提供了很大的灵活性:我们在 JSONLoader 的实现中重写了 __init__ 方法,自动确定我们正在加载的模型的 kind 以及它的属性列表,以便提供给 bulkloader.Loader 的父类。

撰写回答