【问题标题】:GAE NDB how to fetch user data and put back into databaseGAE NDB 如何获取用户数据并放回数据库
【发布时间】:2014-04-02 09:19:57
【问题描述】:

我最近在 Google App Engine 上从 ext.db 切换到了 NDB.model,但总的来说,我对数据库还是很陌生。下面是新的 NDB 代码,与 ext.db 基本没有变化。

我想要做的是当用户尝试登录时,检查 uid 是否存在。如果是这样,则将数据库中的数据作为“条目”传回。如果 uid 不存在,则从 Json 中提取数据并填充新的“条目”。

class User(ndb.Model):
    uid             = ndb.StringProperty(required = True)
    firstName       = ndb.StringProperty(required = True)
    lastName        = ndb.StringProperty(required = True)
    emailAddress    = ndb.StringProperty(required = True)
    password        = ndb.StringProperty(required = True)
    created         = ndb.DateTimeProperty(auto_now_add = True)
    last_modified   = ndb.DateTimeProperty(auto_now = True)

    @classmethod
    def addUser(cls, info):
        entry = User.query().filter(Profile.uid == info['uid']).get        
        #USED TO BE FOR DB: entry = User.all().filter('uid = ', info['uid']).get()
        # if the profile doesn't exist, create it with basic information
        if entry == None:
            entry = User(uid = info["id"], 
                     firstName = info["firstName"], 
                     lastName = info["lastName"], 
                     emailAddress = info["emailAddress"], 
                     password = info[passwd])
        # At this point, we have a valid entry.
        entry.last_modified = datetime.now()
        entry.put()
        return entry

此代码不起作用。我试过entry = User.query().filter(Profile.uid == info['uid']).get,但我得到一个属性错误

AttributeError: 'instancemethod' 对象没有属性 'last_modified'

我很抱歉无法澄清更多,但我被困住了。我错过了什么? ext.db 一切正常(请注意我在上面的代码中所做的更改),但我看不出 NDB 有什么问题。我也在寻求改进,所以请提出更改建议。

非常感谢任何帮助!谢谢。

【问题讨论】:

    标签: python google-app-engine database-design app-engine-ndb


    【解决方案1】:

    如果是你,我会使用:

    entry = User.query(Profile.uid == info['uid']).get()
    

    而不是:

    entry = User.query().filter(Profile.uid == info['uid']).get
    

    您可以直接在查询声明中指定过滤器,用逗号分隔。不要忘记最后的括号,否则你会创建一个函数指针。

    【讨论】:

      【解决方案2】:

      这一行是你的问题

      entry = User.query().filter(Profile.uid == info['uid']).get  
      

      您没有调用该方法,只是将其分配给条目。

      【讨论】:

      • 感谢您指出问题。我试图理解它。用于 ext.db 的 entry = User.all().filter('uid = ', info['uid']).get() 和用于 NDB 的 entry = User.query().filter(Profile.uid == info['uid']).get 有什么区别?
      • 在这两种情况下,该行都应该​​是 get()。您只是忘记了括号,因此您没有在代码中调用 get(),您只是将方法分配给 entry 因此错误 AttributeError: 'instancemethod' object has no attribute 'last_modified' 在这种情况下是 get 实例方法。
      • 当然 instancemethod get 没有属性 lastmodified。\
      【解决方案3】:
      @ndb.transactional
      def my_get_or_insert(cls, id, **kwds):
        entry = cls.query().filter(Profile.uid == info['uid']).get  
        if not entry:
          entry = cls(**kwds)
        entry.last_modified = datetime.now()
        entry.put()
        return (entry, True)  # True meaning "created"
      

      事务性 - 避免脏数据库操作

      kwrds =  {'uid': info["id"], 
                           'firstName' : info["firstName"], 
                           'lastName' : info["lastName"], .....
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-10
        • 2015-09-25
        • 1970-01-01
        相关资源
        最近更新 更多