MySQL sqlalchemy中的同表外键

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机制、反向引用等方式,轻松地进行表内部的关系查询。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程