在谷歌应用引擎中设计数据库

时间:2012-01-21 19:22:05

标签: python database google-app-engine

我是GAE的新人,所以如果你想提供帮助,请写一些细节和例子。

我正在尝试做两个db模型,User和Article。每个用户都可以有一些文章。在sql server中它将是:

create table User
(
    id int primary key identity(1,1),
    login nvarchar(50) unique not null,
    password nvarchar(50) not null,
    email nvarchar(50) unique not null,
)

create table Article
(
    userId int references User(id) not null,
    topic nvarchar(50) not null,
    content nvarchar(max) not null
)

在python中我尝试:

class Article(db.Model):
     topic = db.StringProperty(multiline=False)
     content = db.StringProperty(multiline=True)

class User(db.Model):
     login = db.StringProperty()
     email = db.EmailProperty()
     password = db.StringProperty(multiline=False)
     articles = db.ListProperty(int) #here I want to do db.ListProperty(Article), but I can't. So I want to keep here id of article.

我的问题是:

  • 如何提供登录信息和电子邮件将是唯一的
  • 如何获取User的主键(在sql中

     select id from User where login = 'sada' and password = 'sd'
    
  • 如何使用此主键搜索用户
  • 如果我想在用户文章
  • 中保留id,我该如何为User添加新文章

也许这是更好的方法,很高兴我会知道一个更好的解决方案

3 个答案:

答案 0 :(得分:3)

首先,Google AppEngine数据存储区不是关系数据库。这是一个完全不同的范例。也许您应该首先查看Datastore Overview documentationMastering the datastore

关于您的具体问题:

  1. 唯一登录和电子邮件:您必须检查它是否已存在,因为数据存储区不提供唯一的约束。您还可以查看此解决方案:Add a Unique Constraint to Google App Engine。或者您可以使用Google Accounts
  2. 用户的主键搜索用户的主键:使用Google AppEngine,您可以直接获得用户:user = db.GqlQuery("SELECT * FROM Users WHERE login IS :1", login)
  3. 参考:这是一篇非常好的文章:Modeling entity relationships

答案 1 :(得分:1)

  1. 数据存储区中没有唯一约束。唯一保证唯一的属性是实体的密钥(key_name)。您可以将登录名和电子邮件合并为一个字符串,并将其用作key_name。这当然会限制更改登录和密码的可能性(您需要创建一个新实体并重写参考)。

  2. 使用此代码(keys_only表示只返回一个键而不是整个实体)

    query = db.Query(User, keys_only=True)
    query.filter('login =', 'sada')
    query.filter('password =', 'sd')
    user_key = query.get()
    
  3. 喜欢这个

    db.get(user_key)
    

    如果您没有密钥,请创建一个:

    user_key = Key.from_path(User, id_or_name)
    
  4. 有几种方法可以做到。阅读data modeling

答案 2 :(得分:0)

关于为谷歌应用引擎设计数据库的书籍并不多。我发现的最有用的资源是Bret Saltkin's talks in the Google I/O。本演讲解释了app引擎数据存储的一些神奇属性。我写了一篇关于data modeling in google app engine here的详细博客。