正在尝试出站电子邮件(子电子邮件)、源电子邮件(父电子邮件% 1)和目标电子邮件(父电子邮件% 2)之间的一对多关系。我正在尝试使用flask-migrate来设置数据库。我使用的命令是:
python manage.py db migrate获取以下错误:
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'这是我到目前为止所知道的:
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)有没有人看到我做错了什么?谢谢!
发布于 2017-12-13 18:12:51
解决方案可能取决于您试图实现哪种类型的继承,可以是单表、具体表还是连接表继承。
考虑到您已经将基类标记为_abstract_,我假设您希望将每个子类映射到它自己的不同表,从而使用具体继承的形式。
在这种情况下,您需要在每个子类上显式定义所有列,即使是同名的列。所以至少你需要设置:
id = db.Column(db.Integer, primary_key=True)在你的派生类上。
除此之外,您可能还需要在子类中设置多态标识,并可能对其进行扩展以允许多态加载。我建议看看关于这个话题的wonderful SQLAlchemy documentation。
https://stackoverflow.com/questions/45180797
复制相似问题