首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一对多关系| Flask-SQLAlchemy和Flask-Migrate

一对多关系| Flask-SQLAlchemy和Flask-Migrate
EN

Stack Overflow用户
提问于 2017-07-19 12:08:01
回答 1查看 503关注 0票数 0

正在尝试出站电子邮件(子电子邮件)、源电子邮件(父电子邮件% 1)和目标电子邮件(父电子邮件% 2)之间的一对多关系。我正在尝试使用flask-migrate来设置数据库。我使用的命令是:

代码语言:javascript
复制
python manage.py db migrate

获取以下错误:

代码语言:javascript
复制
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'outbound_emails.target_id' could not find table 'targets' with which to generate a foreign key to target column 'id'

这是我到目前为止所知道的:

代码语言:javascript
复制
class Contact(Base):
    __abstract__ = True
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.Text, nullable=False)
    last_name = db.Column(db.Text, nullable=False)
    email = db.Column(db.Text, nullable=False)
    phone = db.Column(db.Text, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow())
    last_activity = db.Column(db.DateTime, default=datetime.utcnow())
    json_data = db.Column(sqlalchemy.dialects.postgresql.JSON)

    def __init__(self, first_name, last_name, email, phone,
                 created_date=datetime.utcnow(), last_activity=datetime.utcnow(), json_data=None):
        if json_data is None:
            json_data = {}
        self.first_name = first_name
        self.last_name = last_name
        self.email = email
        self.phone = phone
        self.created_date = created_date
        self.last_activity = last_activity
        self.json_data = json_data


class Target(Contact):
    __tablename__ = 'targets'
    outbound_emails = db.relationship("OutboundEmail", backref="target", lazy='dynamic')

    @property
    def __repr__(self):
        return '<target_id {}>'.format(self.target_id)


class Source(Contact):
    __tablename__ = 'sources'
    outbound_emails = db.relationship("OutboundEmail", backref="source", lazy='dynamic')

    @property
    def __repr__(self):
        return '<source_id {}>'.format(self.source_id)


class OutboundEmail(db.Model):
    __tablename__ = 'outbound_emails'
    email_id = db.Column(db.Integer, primary_key=True)
    provider_id = db.Column(db.Text, nullable=True)
    source_id = db.Column(db.Integer, db.ForeignKey("sources.id"))
    target_id = db.Column(db.Integer, db.ForeignKey("targets.id"))
    data = db.Column(sqlalchemy.dialects.postgresql.JSON)

    def __init__(self, provider_id, source, target, merge_fields):
        self.provider_id = provider_id
        self.source = source
        self.target = target
        self.data = merge_fields


    @property
    def __repr__(self):
        return '<email_id {}>'.format(self.email_id)

有没有人看到我做错了什么?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-12-13 18:12:51

解决方案可能取决于您试图实现哪种类型的继承,可以是单表、具体表还是连接表继承。

考虑到您已经将基类标记为_abstract_,我假设您希望将每个子类映射到它自己的不同表,从而使用具体继承的形式。

在这种情况下,您需要在每个子类上显式定义所有列,即使是同名的列。所以至少你需要设置:

代码语言:javascript
复制
id = db.Column(db.Integer, primary_key=True)

在你的派生类上。

除此之外,您可能还需要在子类中设置多态标识,并可能对其进行扩展以允许多态加载。我建议看看关于这个话题的wonderful SQLAlchemy documentation

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45180797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档