Flask_Appbuilder使用过程中遇到的坑-关于数据库外键

  • A+
所属分类:Flask
摘要这一篇文章是关于flask_appbuilder的一个小坑吧,关于数据库外键的设置问题,记录在这里。

问题来源

最近在使用flask_appbuilder的时候,在使用数据库外键的时候遇到了一些报错:

sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship version_patch.patchcode - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.

出现这个问题的原因是因为数据库设置中ForeignKey中表名设置出现了问题,我们看一下下面的解决方法。

解决思路

首先看一下原因:

原来db.ForeignKey中的‘表名.字段名'中的表名是数据库上的表名,我们可以使tablename = 'VERSION_PATCH'来指定表名字。

我们来看一个例子:

  1. # 服务商分组表
  2. class Providers(Model):
  3.     id = Column(Integer, primary_key=True)
  4.     name = Column(String(50), unique=True, nullable=False)
  5.     def __repr__(self):
  6.         return self.name
  7. # 数据服务表
  8. class DataService(Model):
  9.     id = Column(Integer, primary_key=True)
  10.     name = Column(String(150), unique=True, nullable=False)
  11.     sales = Column(String(500))
  12.     provider_id = Column(Integer, ForeignKey('provider.id'), nullable=False)
  13.     providers = relationship("Provider")

上面这个数据库的定义会报错,我们来看一下解决方法;

方法一

将表Providers增加表名字,providers,使这个名字和DataService中外ForeignKey('providers.id')中的provider一样

  1. # 服务商分组表
  2. class Providers(Model):
  3.     __tablename__ = 'providers'
  4.     id = Column(Integer, primary_key=True)
  5.     name = Column(String(50), unique=True, nullable=False)
  6.     def __repr__(self):
  7.         return self.name
  8. # 数据服务表
  9. class DataService(Model):
  10.     id = Column(Integer, primary_key=True)
  11.     name = Column(String(150), unique=True, nullable=False)
  12.     sales = Column(String(500))
  13.     provider_id = Column(Integer, ForeignKey('providers.id'), nullable=False)
  14.     providers = relationship("Provider")

方法二

在使用外键的时候直接使用类的名字,如这里的用法:

  1. # 服务商分组表
  2. class Providers(Model):
  3.     __tablename__ = 'providers'
  4.     id = Column(Integer, primary_key=True)
  5.     name = Column(String(50), unique=True, nullable=False)
  6.     def __repr__(self):
  7.         return self.name
  8. # 数据服务表
  9. class DataService(Model):
  10.     id = Column(Integer, primary_key=True)
  11.     name = Column(String(150), unique=True, nullable=False)
  12.     sales = Column(String(500))
  13.     provider_id = Column(Integer, ForeignKey(Providers.id), nullable=False)
  14.     providers = relationship("Provider")

我们突出强调一下:

  1. provider_id = Column(Integer, ForeignKey(Providers.id), nullable=False)

 

结语

到这里我们就把flask_appbuilder中的一个坑解决掉了,最近感觉flask_appbuilder虽说很方便,但是不是很灵活,可能还需要继续看一下。

 

参考文章

flask_appbuilder使用过程中遇到的坑之一

flask-sqlalchemy 字段关联问题(sqlalchemy.exc.NoForeignKeysError)

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: