【问题标题】:Flask SQLAlchemy Foreign Key RelationshipsFlask SQLAlchemy 外键关系
【发布时间】:2017-05-24 23:09:18
【问题描述】:

我很难理解 SQLAlchemy 中的外键和关系。我的数据库中有两个表。第一个是Request,第二个是Agent。每个Request 包含一个Agent,每个Agent 包含一个Request

class Request(db.Model):
    __tablename__ = 'request'
    reference = db.Column(db.String(10), primary_key=True)
    applicationdate = db.Column(db.DateTime)
    agent = db.ForeignKey('request.agent'),

class Agent(db.Model):
    __tablename__ = 'agent'
    id =     db.relationship('Agent', backref='request', \
    lazy='select')
    name = db.Column(db.String(80))
    company = db.Column(db.String(80))
    address = db.Column(db.String(180))

当我运行db.create_all() 时出现以下错误

无法初始化表 'applicant' 上 ForeignKey 'request.agent' 的目标列:表 'request' 没有名为 'agent' 的列

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    看看SqlAlchemy documentation on OneToOne relationships。首先,您需要为每个模型提供一个Primary Key。然后你需要定义一个Foreign Key 引用另一个模型的Primary Key。现在您可以使用允许直接访问相关模型的 backref 定义关系。

    class Request(db.Model):
        __tablename__ = 'request'
        id = db.Column(db.Integer, primary_key=True)
        applicationdate = db.Column(db.DateTime)
    
    class Agent(db.Model):
        __tablename__ = 'agent'
        id = db.Column(db.Integer, primary_key=True)   
        request_id = db.Column(db.Integer, db.ForeignKey('request.id'))
        request = db.relationship("Request", backref=backref("request", uselist=False))
    
        name = db.Column(db.String(80))
        company = db.Column(db.String(80))
        address = db.Column(db.String(180))
    

    现在您可以像这样访问您的模型:

    request = Request.query.first()
    print(request.agent.name)
    
    agent = Agent.query.first()
    print(agent.request.applicationdate)
    

    【讨论】:

    • 在这种情况下,以下 2 行应如下所示:request_id = db.Column(db.Integer, db.ForeignKey('request.id'))request = db.relationship("Request", backref=db.backref("request", uselist=False)),因为数据库导入为 db
    • 但是@MrLeeh,你能告诉我,为什么是 backref = "request" ,而不是 "Request"?
    • 表名是“request”。这是你需要在这里传递的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多