Flask 学习笔记
一、外键
在 Mysql 中,外键可以让表之间的关系更加紧密。而 SQLAlchemy 同样也支持外键。通过 ForeignKey
类来实现,并且可以指定表的外键约束。
1.1、外键设置
# 子表
class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
content = Column(Text, nullable=False)
# 外键字段设置
uid = Column(Integer, ForeignKey('user.id'))
def __repr__(self):
return f"{self.id} {self.title} {self.content} {self.uid}"
# 父表
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False)
def __repr__(self):
return f"{self.id} {self.username}"
这里还需要注意,表的引擎得是 InnoDB
才可以创建外键。默认是 MyISAM
,为了方便可以去 my.ini 文件进行修改。
如下显示就说明创建成功了。
1.2、外键约束
-
RESTRICT
:父表数据被删除,会阻止删除。这是默认约束。 -
NO ACTION
:在 MySQL 中,同 RESTRICT 。 -
CASCADE
:级联删除。相关联的两张表同时删除关联数据。 -
SET NULL
:父表数据被删除,子表外键字段数据会设置为 NULL 。
uid = Column(Integer, ForeignKey('user.id', ondelete='SET NULL'))
删除测试一下:
# 外键的查询
article = session.query(Article).first()
uid = article.uid
user = session.query(User).get(uid)
print(user)
# ORM 删除父表 user 中的数据, 查看字表有何不同
user = session.query(User).first()
print(user.username)
session.delete(user)
session.commit()