【问题标题】:GAE Python Datastore - query on nested class tableGAE Python Datastore - 查询嵌套类表
【发布时间】:2014-10-29 10:43:45
【问题描述】:

我有一个包含一些嵌套类的 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

谢谢!

【问题讨论】:

  • 注意术语“子类”和“超类”,因为在这种特殊情况下,您分别显示“静态嵌套类”和“外部类”。除此之外,您是否尝试过使用 @Persistent( name="SomethingWithoutADollarSign") 注释嵌套类?
  • @Matt 你是对的,谢谢,问题已更新!不,我还没有尝试过,我会尽快尝试。谢谢!

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


【解决方案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'

【讨论】:

  • The annotation @Persistent is disallowed for this location。阅读@Persistent 文档:Annotation used to define the fields/properties to be persisted. 这意味着@Persistend 不能用于类或嵌套类本身,对吗?
  • 看看here,它展示了两种获得相同结果的方法,一种使用嵌套类,另一种仅使用注释。
  • 我正在尝试您的解决方案,我会通知您,谢谢。如果一切正常,那么我应该能够在我的 py 代码中定义像 class NestedClass(db.Model): 这样的嵌套类,对吧?
  • 好吧,实际上,此时,您通过外部表的where 子句与@Embedded 表进行交互,因此您不需要为此在 Python 中创建 ORM 层特定的表。
  • 我不得不声明那个类,无论如何,有了你的解决方案,现在一切都像一个魅力。谢谢
猜你喜欢
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
相关资源
最近更新 更多