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

本文介绍了在使用Flask_Appbuilder时遇到的关于MySQL外键的错误,即sqlalchemy.exc.NoForeignKeysError。问题源于数据库表名在ForeignKey设置中的不正确引用。解决方案包括明确表名或直接使用类名。通过修改`ForeignKey`的参数,例如`ForeignKey('providers.id')`,可以避免此类错误。
摘要由CSDN通过智能技术生成

摘要这一篇文章是关于flask_appbuilder的一个小坑吧,关于数据库外键的设置问题,记录在这里。

文章目录(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虽说很方便,但是不是很灵活,可能还需要继续看一下。

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值