2012-01-21 2 views
1

Je suis nouveau dans GAE, donc si vous voulez aider, s'il vous plaît écrire quelques détails et exemples. J'essaye de faire deux modèles de DB, utilisateur et article. Chaque utilisateur peut avoir un article. Dans le serveur sql il serait:concevoir une base de données dans google app engine

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 
) 

en python J'essaie:

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. 

Et mes questions sont:

  • comment puis-je prévoir que la connexion et le courrier électronique sera unique
  • comment puis-je obtenir la clé primaire pour l'utilisateur (en sql

    select id from User where login = 'sada' and password = 'sd' 
    
  • comment puis-je utiliser cette clé primaire pour rechercher l'utilisateur
  • comment puis-je ajouter nouvel article pour l'utilisateur, si je veux garder id dans l'utilisateur-articles

Peut-être il est une meilleure façon de faire ceci, volontiers je connaîtrai une meilleure solution

Répondre

3

D'abord, le magasin de données Google AppEngine n'est pas une base de données relationnelle. C'est un paradigme complètement différent. Peut-être que vous devriez d'abord jeter un oeil à la Datastore Overview documentation ou Mastering the datastore.

En ce qui concerne vos questions spécifiques:

  1. connexion unique et email: vous devez vérifier qu'il n'existe pas déjà, car datastore ne fournit pas uniques contraintes. Vous pouvez également jeter un oeil à cette solution: Add a Unique Constraint to Google App Engine. Ou vous pouvez utiliser Google Accounts.
  2. Clé primaire pour l'utilisateur et Clé primaire pour rechercher l'utilisateur: en utilisant Google AppEngine vous obtiendrez directement l'utilisateur: user = db.GqlQuery("SELECT * FROM Users WHERE login IS :1", login)
  3. Référence: voici un très bon article sur le sujet: Modeling entity relationships
1
  1. Il n'existe pas de contraintes uniques dans Datastore. La seule propriété qui est garantie être unique est la clé de l'entité (key_name). Vous pouvez combiner login et email dans une chaîne et l'utiliser comme key_name. Cela limitera bien entendu la possibilité de changer de login et de pasword (vous devrez créer une nouvelle entité et réécrire les références).

  2. Utilisez ce code (keys_only signifie seulement une clé est retournée au lieu de l'entité entière)

    query = db.Query(User, keys_only=True) 
    query.filter('login =', 'sada') 
    query.filter('password =', 'sd') 
    user_key = query.get() 
    
  3. Vous aimez cette

    db.get(user_key) 
    

    si vous ne disposez pas d'une clé, créez un:

    user_key = Key.from_path(User, id_or_name) 
    
  4. Il existe plusieurs façons de fais le. Lisez à propos de data modeling.