GAE Python数据存储区 - 在嵌套类表上查询

时间:2014-10-29 10:43:45

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

我有一个包含一些嵌套类的Java类,如下所示:

public class OuterClass{

    @PrimaryKey
    private String id;

    @Persistent
    private String name;

    // --- blah blah

    static class MyNestedClass{
        //--- properties declaration
    }
}

这个类工作正常,基本上只在一个结构中(OuterClass)我可以存储 n 嵌套结构,每个结构都作为数据存储表工作。

datastore viewer检查我的ds我发现我现在有一个名为OuterClass$MyNestedClass的表,我可以在这个表上成功运行GQL查询,如下所示:

//--- note the wrapping quotation marks on the table name
SELECT * FROM "OuterClass$MyNestedClass" where something = '100'

直到现在一切正常。现在我需要创建一个google app engine python方法来清空嵌套的类表。我已经使用其他表/类执行此操作,但从未使用嵌套类。

这是我的python代码:

import cgi
import datetime
import urllib
import webapp2

from google.appengine.ext import db

class OuterClass$MyNestedClass(db.Model):
    name = db.StringProperty()
    surname= db.StringProperty()
    age = db.StringProperty()

class emptyMyNestedClassHandler(webapp2.RequestHandler):
    def get(self):
        nestedclass= db.GqlQuery("SELECT __key__ FROM \"OuterClass$MyNestedClass\"")
        count = 0

        for p in nestedclass:
            count += 1
        db.delete(nestedclass)

        self.response.out.write("Deleted SMyNestedClass Entities: " + str(count))

app = webapp2.WSGIApplication([
    ('/emptyMyNestedClass', emptyMyNestedClassHandler)
], debug=True)

这是我得到的错误

class OuterClass$MyNestedClass(db.Model):
                ^
SyntaxError: invalid syntax

我尝试将班级名称从OuterClass$MyNestedClass更改为MyNestedClass,但我收到此错误:

KindError: No implementation for kind 'OuterClass$MyNestedClass'

我必须将哪个名称分配给我的python类才能使其正常工作?我该如何处理$问题?

希望我已经足够清楚,谢谢


解决方案

关注Matt's suggestion,我的JAVA课程现在看起来像这样:

public class OuterClass{

    @PrimaryKey
    private String id;

    @Persistent
    private String name;

    // --- blah blah
    @PersistenceCapable( table="NestedClass")
    @Embedded
    static class NestedClass{
        //--- properties declaration
    }
}

这是Python代码:

import cgi
import datetime
import urllib
import webapp2

from google.appengine.ext import db

class NestedClass(db.Model):
    name = db.StringProperty()
    surname = db.StringProperty()
    age = db.StringProperty()

class emptyNestedClassHandler(webapp2.RequestHandler):
    def get(self):
        nestedclass= db.GqlQuery("SELECT __key__ FROM NestedClass")
        count = 0

        for p in nestedclass:
            count += 1
        db.delete(nestedclass)

        self.response.out.write("Deleted NestedClassEntities: " + str(count))

app = webapp2.WSGIApplication([
    ('/emptyNestedClass', emptyNestedClassHandler)
], debug=True)

请注意,我来声明课程NestedClass

谢谢!

1 个答案:

答案 0 :(得分:1)

查看JDO annotations的此资源。

您可能希望像这样注释您的课程:

public class OuterClass{

    @PrimaryKey
    private String id;

    @Persistent
    private String name;

    // --- blah blah
    @PersistenceCapable( table="NestedClass")
    @Embedded
    static class NestedClass{
        //--- properties declaration
    }
}

使用GQL,你应该能够做到这一点:

SELECT * FROM "OuterClass" where NestedClass.something = '100'