Les Clés composites dans Sqlalchemy
Je suis en utilisant flask-sqlalchemy
pour construire une application web et j'ai le modèle suivant(s):
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
candidates = db.relationship('Candidate', backref='post', lazy='dynamic')
def __init__(self, name):
self.name = name
def __repr__(self):
return "<Post %r>" % self.name
class Candidate(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), primary_key=True)
post_id = db.Column(db.Integer, db.ForeignKey('post.id'))
hostel = db.Column(db.String(80))
yes_no = db.Column(db.Boolean)
#votes = db.relationship('Vote', backref='vote', lazy="dynamic")
def __init__(self, name, hostel, post_id, yes_no):
self.name = name
self.hostel = hostel
self.post_id = post_id
self.yes_no = yes_no
def __repr__(self):
return "<Candidate: %r, Post: %r>" % (self.name, self.post.name)
Je suis totalement noob quand il s'agit de la base de données de conception, donc je vais vraiment apprécier quelques conseils sur certaines questions que je
- Est le
id
colonne nécessaire? La plupart des tutos que j'ai vu ont que comme une colonne de clé primaire en particulier). Puis-je faire sans elle? En particulier dans les cas où j'ai une autre clé primaire? - Comment puis-je avoir une clé composite contrainte sur Candidat#Nom et Candidat#post_id colonnes, étant donné que post_id est une clé étrangère.
- Comment puis-je "actualiser" de ma base de données. Après j'ai fait des changements dans le modèle, comment puis-je faire en sorte que ces modifications sont reflétées dans les tables réelles? Ai-je besoin de
drop_all
etcreate_all
manuellement? - Enfin, le
sqlalchemy
documentation s'appliquent àflask-sqlalchemy
ainsi?
Vous pouvez scinder ces questions, vous rendant la tâche plus difficile pour les gens de vous fournir des réponses lors de la publication de plusieurs questions en une seule question. Tous les
sqlalchemy
documentation s'applique à flask-sqlalchemy
.OriginalL'auteur Prakhar | 2012-06-23
Vous devez vous connecter pour publier un commentaire.
Pour le poste de la table, oui. Pour les autres, non. Certains pourraient faire valoir que, puisque le nom est unique, faire une clé primaire, mais cela reviendrait à utiliser le nom n'importe où vous avez besoin de faire référence à ce poste, ce qui signifie plus d'espace (longueur du nom vs int) (pas nécessairement un problème) et de réfléchir sur "que faire si le candidat changements de nom?". Cependant, vous n'avez certainement pas besoin des deux.
Comment vous le faites, chaque poste est attribué à un seul poste:
Ainsi, le champ ne doit pas être appelé
candidates
maiscandidate
à faire sens.Pour répondre à votre question, permettez-moi de citer les docs:
Vous devez l'ajouter à votre définition du modèle:
Bien que je pense qu'il est inutile ici (pourquoi avez-vous besoin? si l'id est unique(clé primaire), alors toute autre combinaison contenant à être unique)...
Vous devez
commit
vos modifications à la base de données. De en flacon de sqlalchemy de la documentation:NOTE C'est ce que j'ai trouvé sur mon propre, aucun "officiel" de la source, juste en lisant en flacon de sqlalchemy de la source.
Oui, ce qui diffère, c'est l'accès le modèle et la session et le moteur et ...
Par exemple, dans sqlalchemy:
Et en flacon de sqlalchemy:
Et pour les "Modèles":
etc...
De toute façon, ce que vous faites dans la sqlalchemy façon, vous le faites une fois, et en flacon de sqlalchemy le fait pour vous dans le fond.
Espère que cela aide 🙂 (et c'est beaucoup plus qu'une question à propos des clés composites dans sqlalchemy...)
Si vous avez besoin d'une clé primaire composite, il suffit de définir
primary_key=True
à tous les champs de clé primaire. Ou utiliser quelque chose de similaire àUniqueConstraint("id", "candidate_id")
dans le__table_args__
. Vous pouvez même spécifier votre plus complexe des clés primaires dans le tableau args.OriginalL'auteur jadkik94