请求此实体的正确方法是什么? Python和GQL

时间:2015-09-25 05:57:55

标签: database google-app-engine entity google-cloud-datastore gql

我试图查看post函数中的username变量是否与accountsArchive实体中的用户名匹配。

我认为问题在于user.username不是引用用户名实体的正确方法。此外,上面的查询可能有问题。查看两个用户名是否匹配的正确方法是什么?

的Python

class accountsArchive(db.Model): 
    # The username entity
    username = db.StringProperty(required = True)
    password = db.TextProperty(required = True)
    email = db.StringProperty(required = True)
    dateJoined = db.DateTimeProperty(auto_now_add = True)

class loginPage(Handler): 
     def post(self): 
        # The username variable
        username = self.request.get("username")
        password = self.request.get("password")

        # The query
        user = db.GqlQuery("SELECT * FROM accountsArchive WHERE      
                            user.username = :name", name=username)

        # This is how I tried to check if the two usernames matched
        if username == user.username: 
            # Do stuff

1 个答案:

答案 0 :(得分:1)

您的代码中存在许多问题。

首先

user = db.GqlQuery("SELECT * FROM accountsArchive WHERE      
                        user.username = :name", name=username)

不正确 - 您应该返回并重新阅读文档https://cloud.google.com/appengine/docs/python/datastore/gqlreference?hl=en

此查询应为

user = db.GqlQuery("SELECT * FROM accountsArchive WHERE      
                        username = :name", name=username)

下一步。

这行代码的结果是GqlQuery类的实例,而不是用户或您可能期望的用户列表。见https://cloud.google.com/appengine/docs/python/datastore/gqlqueryclass?hl=en

您现在必须获取结果和/或迭代它们。

例如

for u in user.run():
    if u.username == username:
       # then do something

但是你有问题。这里没有任何内容可以限制系统的唯一用户。因此,如果您使用相同的用户名获得多个用户,那么您将做什么。

一些评论。

您可以使用username作为accountsArchive的密钥,这意味着您只需使用get而不是查询。

其次,如果您不熟悉appengine并且没有现有的代码基础,请先使用ndb开始。