我是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'
也许这是更好的方法,很高兴我会知道一个更好的解决方案
答案 0 :(得分:3)
首先,Google AppEngine数据存储区不是关系数据库。这是一个完全不同的范例。也许您应该首先查看Datastore Overview documentation或Mastering the datastore。
关于您的具体问题:
user = db.GqlQuery("SELECT * FROM Users WHERE login IS :1", login)
答案 1 :(得分:1)
数据存储区中没有唯一约束。唯一保证唯一的属性是实体的密钥(key_name
)。您可以将登录名和电子邮件合并为一个字符串,并将其用作key_name
。这当然会限制更改登录和密码的可能性(您需要创建一个新实体并重写参考)。
使用此代码(keys_only
表示只返回一个键而不是整个实体)
query = db.Query(User, keys_only=True)
query.filter('login =', 'sada')
query.filter('password =', 'sd')
user_key = query.get()
喜欢这个
db.get(user_key)
如果您没有密钥,请创建一个:
user_key = Key.from_path(User, id_or_name)
有几种方法可以做到。阅读data modeling。
答案 2 :(得分:0)
关于为谷歌应用引擎设计数据库的书籍并不多。我发现的最有用的资源是Bret Saltkin's talks in the Google I/O。本演讲解释了app引擎数据存储的一些神奇属性。我写了一篇关于data modeling in google app engine here的详细博客。