2017-09-15 45 views
0

我写了一个小工具,可以从书面规范中创建SQLAlchemy代码。该工具可以像这样创建代码:如何“解析”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)) 

我可以插入新记录,我可以查询他们,就像一个魅力,但我真的想不必手动查找的地址人。

我希望能够通过Person对象访问属于特定人员的地址。如果我正确理解示例,我需要这样做(基于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')) 

这在我看来所有的倒退,我必须给每一个地址“链接”到某个人,然后backref所以我可以有一个人的地址吗?这是不可能直接从人做?

此外,为此创建代码要复杂得多,所以我真的很想避免这种情况。

回答

1

在第一个示例中,Person可以只有一个地址,但每个地址可以被多个人使用。 在您的第二个解决方案中,人员现在可以拥有多个地址,但每个地址对于给定的人员都是唯一的(请注意,ForeignKey移动了表格)。

所以你从N:1变成了1:N。通过说你想要一个N侧的列表,而不是一侧的实例,你现在必须指定更多。

+0

我知道,这就是为什么我问。没有1:1的例子可以找到,1:N例子都有(对我来说)多余的backref事情。我想知道如何做1:1的最简单的方法,所以我不必在有人的时候对地址进行第二次查询。 – ramdyne