SQLAlchemy —— 外键及其约束

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、外键约束

  1. RESTRICT:父表数据被删除,会阻止删除。这是默认约束。

  2. NO ACTION:在 MySQL 中,同 RESTRICT 。

  3. CASCADE:级联删除。相关联的两张表同时删除关联数据。

  4. 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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值