2017-09-15 5 views
0

J'ai écrit un petit outil qui crée du code SQLAlchemy à partir d'une spécification écrite. L'outil peut créer un code comme ceci:Comment "résoudre" les clés étrangères dans les résultats de requête SQLAlchemy?

class Person(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    address_id = db.Column(db.Integer, db.ForeignKey('address.id')) 

class Address(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    email = db.Column(db.String(50)) 

Je peux insérer de nouveaux enregistrements, je peux les interroger, qui fonctionne comme un charme, mais je voudrais vraiment ne pas avoir à rechercher manuellement l'adresse d'un La personne.

Je souhaite être en mesure d'accéder à l'adresse appartenant à une personne spécifique via l'objet Personne. Si je comprends bien les exemples, je dois le faire comme ceci (exemple basé sur http://flask-sqlalchemy.pocoo.org/2.1/models/#one-to-many-relationships)?

class Person(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    address = db.relationship('Address', backref='person', 
           lazy='dynamic') 

class Address(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    email = db.Column(db.String(50)) 
    person_id = db.Column(db.Integer, db.ForeignKey('person.id')) 

Cela me semble tout à l'envers, je dois donner à chaque adresse un « lien » à une personne, puis backref donc je peux avoir une adresse pour une personne? Est-ce que ce n'est pas possible de faire directement à partir de la personne?

En outre, la création de code pour cela est beaucoup plus compliquée, donc j'aimerais vraiment éviter cela.

Répondre

1

Dans le premier exemple, la personne peut avoir exactement 1 adresse, mais chaque adresse peut être utilisée par plusieurs personnes. Dans votre deuxième solution Personne peut maintenant avoir plusieurs adresses, mais chaque adresse est unique à une personne donnée (notez que les tables ForeignKey déplacées).

Vous êtes ainsi passé de N: 1 à 1: N. En disant que vous voulez une liste du N-side, plutôt que l'instance sur le 1-side, vous devez maintenant spécifier plus.

+0

Je sais, c'est pourquoi je demande. Il n'y a pas d'exemples 1: 1 que je puisse trouver et les exemples 1: N ont tous (pour moi) une chose superflue en arrière-plan. Je voudrais savoir comment faire 1: 1 le plus simple possible, donc je n'ai pas à faire une deuxième requête pour l'adresse quand j'ai la personne. – ramdyne