文章目录(Table of Contents)
问题来源
最近在使用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'来指定表名字。
我们来看一个例子:
- # 服务商分组表
- class Providers(Model):
- id = Column(Integer, primary_key=True)
- name = Column(String(50), unique=True, nullable=False)
- def __repr__(self):
- return self.name
- # 数据服务表
- class DataService(Model):
- id = Column(Integer, primary_key=True)
- name = Column(String(150), unique=True, nullable=False)
- sales = Column(String(500))
- provider_id = Column(Integer, ForeignKey('provider.id'), nullable=False)
- providers = relationship("Provider")
上面这个数据库的定义会报错,我们来看一下解决方法;
方法一
将表Providers增加表名字,providers,使这个名字和DataService中外ForeignKey('providers.id')中的provider一样
- # 服务商分组表
- class Providers(Model):
- __tablename__ = 'providers'
- id = Column(Integer, primary_key=True)
- name = Column(String(50), unique=True, nullable=False)
- def __repr__(self):
- return self.name
- # 数据服务表
- class DataService(Model):
- id = Column(Integer, primary_key=True)
- name = Column(String(150), unique=True, nullable=False)
- sales = Column(String(500))
- provider_id = Column(Integer, ForeignKey('providers.id'), nullable=False)
- providers = relationship("Provider")
方法二
在使用外键的时候直接使用类的名字,如这里的用法:
- # 服务商分组表
- class Providers(Model):
- __tablename__ = 'providers'
- id = Column(Integer, primary_key=True)
- name = Column(String(50), unique=True, nullable=False)
- def __repr__(self):
- return self.name
- # 数据服务表
- class DataService(Model):
- id = Column(Integer, primary_key=True)
- name = Column(String(150), unique=True, nullable=False)
- sales = Column(String(500))
- provider_id = Column(Integer, ForeignKey(Providers.id), nullable=False)
- providers = relationship("Provider")
我们突出强调一下:
- provider_id = Column(Integer, ForeignKey(Providers.id), nullable=False)
结语
到这里我们就把flask_appbuilder中的一个坑解决掉了,最近感觉flask_appbuilder虽说很方便,但是不是很灵活,可能还需要继续看一下。
参考文章
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论