GAE中的多对多关系。查询失败

2024-05-28 19:42:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在gae中使用经典的ListProperty来建模多对多关系数据库键实例。在

class Foo(db.Model):
    name = db.StringProperty()
    _bars = db.ListProperty(db.Key)

    @property
    def bars(self):
        return Bar.gql("WHERE __key__ in :1", self._bars)

class Bar(db.Model):
    name = db.StringProperty()

    @property
    def bands(self):
        return Foo.gql("WHERE _bars = :1", self.key())

class QueryTest(unittest.TestCase):

    def setUp(self):
        db.delete(Foo.all().run())
        db.delete(Bar.all().run())

    def test_query_no_notification(self):
        bar_1 = Bar(name="asdf")
        bar_1.put()
        bar_2 = Bar(name="qwer")
        bar_2.put()
        foo = Foo()
        foo.put()
        self.assertEqual(len([bar for bar in foo.bars]), 0)

    def test_query_with_bars(self):
        bar_1 = Bar(name="asdf")
        bar_1.put()
        bar_2 = Bar(name="qwe")
        bar_2.put()

        foo = Foo()
        foo._bars.append(bar_1.key())
        foo.put()
        self.assertEqual(len([bar for bar in foo.bars]), 1)

在上面的代码中,第一个测试失败。当_barsListProperty为空时,Bar.gql("WHERE __key__ in :1", self._bars) 返回所有Bar对象(而不是none)。在

但是,如果_bars至少包含一个元素,则查询运行良好。在

我很好奇这是不是GAE中的一个bug,或者我编写查询的方式是错误的。。。在

谢谢


Tags: keynameinselfdbfooputdef
1条回答
网友
1楼 · 发布于 2024-05-28 19:42:06

这看起来很反常。你能运行AppStats,看看正在执行哪些底层查询吗?在

然而,你所做的并不是最有效的方法。当您运行一个类似SELECT * FROM Foo WHERE bar in :1的查询时,SDK会将其分解为列表中每个项的一个相等查询,并分别执行它们。但是,您尝试按键查找项,而数据存储有一个内置方法来执行此操作。将当前查询替换为:

return Bar.get(self._bars)

相关问题 更多 >

    热门问题