MySQL sqlalchemy中的同表外键
在本文中,我们将介绍MySQL中的同表外键,在sqlalchemy中的使用方法。
阅读更多:MySQL 教程
什么是同表外键?
同表外键是指一张表中的外键所关联的表依然为本张表本身。由于同一表中的主键和外键都依赖于该表,所以同表外键一般用于表示一个表中的不同数据之间的依赖关系。
比如我们有一个文章表(Article),其中每一篇文章都有可能有一个前置文章,而前置文章又是文章表中的某一篇文章,这时就可以给文章表添加一个字段pre_article_id,表示该文章所依赖的前置文章的ID。这个pre_article_id字段就是本表中的外键,而这个外键所关联的表依然为该文章表自身。
sqlalchemy中的同表外键
在sqlalchemy中实现同表外键的方法和普通外键基本相同,只需在定义表结构时,将外键所关联的表名改为该表自身即可。
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True)
title = Column(String(255))
content = Column(Text)
pre_article_id = Column(Integer, ForeignKey('article.id'))
pre_article = relationship('Article', remote_side=[id])
本代码中,我们定义了一个文章表,其中包含id、title、content以及pre_article_id四个字段,其中pre_article_id为该表的同表外键。在定义后,我们再通过relationship函数定义了一个Article类的对象实例pre_article,这个实例将表示一个“前置文章”的概念。remote_side参数告诉sqlalchemy,我们的pre_article字段所依赖的是该表中的id字段(即这是一个对自身的外键依赖关系)。通过这种方式,我们便定义好了该表的同表外键。
使用同表外键
使用同表外键大致与使用普通外键相同,只需注意依赖关系的定义就可以。
比如我们要找到某篇文章的前置文章,我们可以用以下代码:
article = session.query(Article).get(1)
pre_article = article.pre_article
这个代码将通过与ORM机制结合,找出id为1的文章对应的“前置文章”对象。这个对象将包含了该篇文章所依赖的前置文章的信息。
同样地,如果我们想找到一篇文章“被哪些文章所依赖”,我们也可以定义一个反向引用:
class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True)
title = Column(String(255))
content = Column(Text)
pre_article_id = Column(Integer, ForeignKey('article.id'))
pre_article = relationship('Article', remote_side=[id])
after_articles = relationship('Article', backref='pre_article', remote_side=[pre_article_id])
在这个新代码中,我们利用了backref参数定义了一个反向引用,表示我们要找到该篇文章的“后置文章们”,也就是“被哪些文章所依赖”。通过这样的定义方式,我们可以很方便地实现该表内部的关系查询。
总结
本文介绍了MySQL中的同表外键,在sqlalchemy中的实现方法。同表外键具有比较特殊的关系定义方式,因此在使用时需要注意其唯一性以及依赖关系的定义等问题。在定义好依赖关系后,我们可以通过ORM机制、反向引用等方式,轻松地进行表内部的关系查询。
极客教程