如何创建单独的python脚本以将数据上传到ndb

时间:2015-12-17 16:14:02

标签: python-2.7 google-app-engine google-cloud-datastore app-engine-ndb

任何人都可以指导我朝着正确的方向指导我应该在哪里放置一个脚本,仅用于将数据加载到ndb中。我希望将所有数据上传到gae ndb,以便应用程序可以对其执行查询。

现在,数据加载在我的应用程序中。我希望将它与主要应用程序分开放置。

是否应该在yaml文件中进行编辑?

EDITED

这是将数据上传到GAE ndb的实体和处理程序的片段。 我希望将这一部分代码与我的主应用程序.py分开。上传这些数据的原因不会经常发生,并且使主应用程序中的代码“更清洁”。

class TagTrend_refine(ndb.Model):
    tag = ndb.StringProperty()
    trendData = ndb.BlobProperty(compressed=True)

class MigrateData(webapp2.RequestHandler):
        def get(self):
        listOfEntities = []
        f = open("tagTrend_refine.txt")
        lines = f.readlines()
        f.close()
        for line in lines:
            temp = line.strip().split("\t")
            data = TagTrend_refine(
                tag = temp[0],
                trendData = temp[1]
            )
        listOfEntities.append(data)
        ndb.put_multi(listOfEntities)

例如,如果我将上述代码放在名为dataLoader.py的文件中,我应该在哪里调用此脚本来调用?

app.yaml和我的主应用程序(knowledgeGraph.application)一起?

- url: /.*
script: knowledgeGraph.application

2 个答案:

答案 0 :(得分:1)

您未在application模块中向我们展示knowledge.py对象(无疑是一个WSGI应用),因此我无法知道您希望将哪个网址用于MigrateData处理程序 - 我只是猜测它是/migratedata

因此class TagTrend_refine应位于单独的文件中(通常称为models.py),以便dataloader.pyknowledge.py import modelsmodels.py访问它(ndb当然需要自己导入models.TagTrend_refine。 (当然,对实体类的访问将是dataloader.py - 非常基本的Python)。

接下来,您将通过定义WSGI应用程序来完成app = webapp2.WSGIApplication(routes=[('/migratedata', MigrateData)]) ,例如,在文件末尾,

webapp2

(当然这意味着这个模块也需要导入app.yaml - 我是否可以理解超级基础Python的知识?)。

/.*中,作为第一个网址,之前 url: /migratedata script: dataloader.app ,您将拥有:

"tagTrend_refine.txt"

考虑到所有这些,当您访问' / migratedata'时,您的处理程序将会读取您与.py.yaml一起上传的 count = 0 beer = 5/100 maltbeer = 7/100 tablewine = 12/100 fortifiedwine = 17/100 aperitif = 24/100 spirits = 40/100 percentageCalc = 0 for i in drinks: count =+ 1 percentageCalc = percentageCalc + drinks[count] 文件,以及等等,整个GAE应用程序中的文件,并无条件地为该文件的每一行创建一个实体(假设您修复了上面显示的代码中的多个缩进问题,但同样,这只是超级基本的Python - 大概是你& #39; ve使用了标签和空格,它们在你的编辑器中显示OK,但在SO上没有显示......我建议你在Python代码中严格使用空格,永远不要使用标签。)

然而,这似乎是一项特殊的任务。如果/ migratedata被访问两次,它将创建所有实体的重复项。如果您更改了tagTrend_refine.txt并部署了更改后的变体,那么请访问/ migratedata ...所有旧实体都将保留,所有新实体都将加入它们。等等。

此外 - / migratedata不是幂等的(如果多次访问它不会产生与仅运行一次相同的状态)所以它不应该是一个GET(现在我们继续使用超级基本的HTTP进行更改! - ) - 它应该是一个POST。

事实上,我怀疑(但我真的在这里盲目,因为你觉得适合提供这么少的信息)你实际上想要将.txt文件上传到POST处理程序并进行更新这样(也许避免重复...?)。但是,我不介意读者,所以这就是我可以做到的。

我相信我已经完全回答了你发布的问题(虽然可能不是你意味着但没有表达的问题: - )并且通过SO的礼仪,赞成并接受这个答案会很好,然后,如果需要,发布另一个问题,更清楚,更完整地表达 MUCH 你正在努力实现的目标,你现在的.py和.yaml(理想情况下是正确的缩进),他们实际做了什么以及你为什么要做一些与众不同的事情。特别是对于POST与GET,只需研究When should I use GET or POST method? What's the difference between them? ...

答案 1 :(得分:0)

只要所有数据都可以在1分钟内加载,Alex的解决方案就可以正常工作,因为这是应用引擎请求的超时时间。

对于较大的数据,请考虑直接从您拥有源的计算机调用数据存储区API。这有点麻烦,因为它是一个不同的API;它不是ndb。但它仍然是一个非常简单的API。以下是一些调用API的代码: https://github.com/GoogleCloudPlatform/getting-started-python/blob/master/2-structured-data/bookshelf/model_datastore.py

同样,这段代码可以在任何地方运行。它不需要上传到app引擎即可运行。