如何创建单独的 python 脚本以将数据上传到 ndb
How to create separate python script for uploading data into ndb
任何人都可以指导我朝着正确的方向前进,我应该在哪里放置一个脚本,专门用于将数据加载到 ndb 中。因为我希望将所有数据上传到 gae ndb 以便应用程序可以对其执行查询。
现在,正在我的应用程序中加载数据。我希望将它与主应用程序分开放置。
是否应该在yaml文件中编辑?
已编辑
这是将数据上传到 GAE ndb 的实体和处理程序的片段。
我希望将这段代码与我的主应用程序 .py 分开放置。原因是不会经常上传此数据并将代码保留在主应用程序中 "cleaner"。
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
你没有在你的 knowledge.py
模块中向我们展示 application
对象(毫无疑问是一个 WSGI 应用程序),所以我不知道你想提供什么 URL使用 MigrateData
处理程序——我猜它类似于 /migratedata
.
因此 class TagTrend_refine
应该放在一个单独的文件中(通常称为 models.py
),这样您的 dataloader.py
和 knowledge.py
都可以 import models
访问它(当然 models.py
需要自己导入 ndb
)。 (当然,对实体 class 的访问将是 models.TagTrend_refine
—— 非常基本的 Python)。
接下来,您将通过定义一个 WSGI 应用程序来完成 dataloader.py
,例如,在文件末尾,
app = webapp2.WSGIApplication(routes=[('/migratedata', MigrateData)])
(当然,这意味着该模块也需要导入 webapp2
——我可以想当然地认为超级基础知识 Python 吗?)。
在app.yaml
,作为第URL,在之前/.*
,你会有:
url: /migratedata
script: dataloader.app
考虑到所有这些,当您访问“/migratedata”时,您的处理程序将读取您上传的 "tagTrend_refine.txt"
文件以及您的 .py
、.yaml
等,整个 GAE 应用程序中的文件,并无条件地为该文件的每一行创建一个实体(假设您修复了上面显示的代码中的多个缩进问题,但是,同样,这只是超级基本 Python -- 大概您同时使用了制表符和空格,它们在您的编辑器中显示正常,但在此处却不是这样...我建议您在 Python 代码中严格使用空格,切勿使用制表符)。
然而,这似乎是一项特殊的任务。如果 /migratedata 被访问两次,它将创建所有实体的副本。如果您更改 tagTrend_refine.txt 并部署更改后的变体,然后访问 /migratedata...所有旧实体将保留下来,所有新实体将加入它们。等等。
此外 -- /migratedata 不是幂等的(如果访问不止一次,它不会产生与 运行 它只产生一次相同的状态)所以它 不应该 是一个 GET(现在我们要改变超级基本的 HTTP!-)——它应该是一个 POST.
事实上我怀疑(但我在这里真的瞎了眼,因为你认为提供如此少量的信息是合适的)你实际上想上传一个 .txt 文件到 POST 处理程序并以这种方式进行更新(也许避免重复......?)。但是,我不介意reader,所以这就是我能做的。
我相信我已经完全回答了你 posted 的问题(虽然可能不是你 的意思 但没有't express:-) 并且按照 SO 的礼节,最好投票并接受这个答案,然后,如果需要,post 另一个 问题,更清楚和完整地表达 MUCH 你想要达到的目标,你当前的 .py 和 .yaml(最好有正确的缩进),他们实际做什么以及你为什么'我想做一些不同的事情。特别是对于 POST 与 GET,只需研究 When should I use GET or POST method? What's the difference between them? ...
Alex 的解决方案将有效,只要您的所有数据都可以在 1 分钟内加载,因为这是应用引擎请求的超时时间。
对于更大的数据,请考虑直接从您拥有源的计算机上调用数据存储区 API。有点麻烦,因为不一样API;这不是新发展银行。但它仍然是一个非常简单的API。下面是一些调用 API 的代码:
https://github.com/GoogleCloudPlatform/getting-started-python/blob/master/2-structured-data/bookshelf/model_datastore.py
同样,此代码可以 运行 任何地方。它不需要上传到应用程序引擎到 运行。
任何人都可以指导我朝着正确的方向前进,我应该在哪里放置一个脚本,专门用于将数据加载到 ndb 中。因为我希望将所有数据上传到 gae ndb 以便应用程序可以对其执行查询。
现在,正在我的应用程序中加载数据。我希望将它与主应用程序分开放置。
是否应该在yaml文件中编辑?
已编辑
这是将数据上传到 GAE ndb 的实体和处理程序的片段。 我希望将这段代码与我的主应用程序 .py 分开放置。原因是不会经常上传此数据并将代码保留在主应用程序中 "cleaner"。
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
你没有在你的 knowledge.py
模块中向我们展示 application
对象(毫无疑问是一个 WSGI 应用程序),所以我不知道你想提供什么 URL使用 MigrateData
处理程序——我猜它类似于 /migratedata
.
因此 class TagTrend_refine
应该放在一个单独的文件中(通常称为 models.py
),这样您的 dataloader.py
和 knowledge.py
都可以 import models
访问它(当然 models.py
需要自己导入 ndb
)。 (当然,对实体 class 的访问将是 models.TagTrend_refine
—— 非常基本的 Python)。
接下来,您将通过定义一个 WSGI 应用程序来完成 dataloader.py
,例如,在文件末尾,
app = webapp2.WSGIApplication(routes=[('/migratedata', MigrateData)])
(当然,这意味着该模块也需要导入 webapp2
——我可以想当然地认为超级基础知识 Python 吗?)。
在app.yaml
,作为第URL,在之前/.*
,你会有:
url: /migratedata
script: dataloader.app
考虑到所有这些,当您访问“/migratedata”时,您的处理程序将读取您上传的 "tagTrend_refine.txt"
文件以及您的 .py
、.yaml
等,整个 GAE 应用程序中的文件,并无条件地为该文件的每一行创建一个实体(假设您修复了上面显示的代码中的多个缩进问题,但是,同样,这只是超级基本 Python -- 大概您同时使用了制表符和空格,它们在您的编辑器中显示正常,但在此处却不是这样...我建议您在 Python 代码中严格使用空格,切勿使用制表符)。
然而,这似乎是一项特殊的任务。如果 /migratedata 被访问两次,它将创建所有实体的副本。如果您更改 tagTrend_refine.txt 并部署更改后的变体,然后访问 /migratedata...所有旧实体将保留下来,所有新实体将加入它们。等等。
此外 -- /migratedata 不是幂等的(如果访问不止一次,它不会产生与 运行 它只产生一次相同的状态)所以它 不应该 是一个 GET(现在我们要改变超级基本的 HTTP!-)——它应该是一个 POST.
事实上我怀疑(但我在这里真的瞎了眼,因为你认为提供如此少量的信息是合适的)你实际上想上传一个 .txt 文件到 POST 处理程序并以这种方式进行更新(也许避免重复......?)。但是,我不介意reader,所以这就是我能做的。
我相信我已经完全回答了你 posted 的问题(虽然可能不是你 的意思 但没有't express:-) 并且按照 SO 的礼节,最好投票并接受这个答案,然后,如果需要,post 另一个 问题,更清楚和完整地表达 MUCH 你想要达到的目标,你当前的 .py 和 .yaml(最好有正确的缩进),他们实际做什么以及你为什么'我想做一些不同的事情。特别是对于 POST 与 GET,只需研究 When should I use GET or POST method? What's the difference between them? ...
Alex 的解决方案将有效,只要您的所有数据都可以在 1 分钟内加载,因为这是应用引擎请求的超时时间。
对于更大的数据,请考虑直接从您拥有源的计算机上调用数据存储区 API。有点麻烦,因为不一样API;这不是新发展银行。但它仍然是一个非常简单的API。下面是一些调用 API 的代码: https://github.com/GoogleCloudPlatform/getting-started-python/blob/master/2-structured-data/bookshelf/model_datastore.py
同样,此代码可以 运行 任何地方。它不需要上传到应用程序引擎到 运行。