FastAPI: 关系型数据库

3 阅读1分钟

介绍

学习关系型数据库的三种常见关系,一对一,一对多,多对多

一对一

class User(Base):
    """用户表"""
    __tablename__ = "user"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
    email: Mapped[str] = mapped_column(String(100))
    username: Mapped[str] = mapped_column(String(100), unique=True,index= True)
    password: Mapped[str] = mapped_column(String(200) )

class UserExtension(Base):
    """用户扩展表"""
    __tablename__ = "user_extension"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
    user_id: Mapped[int] = mapped_column(Integer, ForeignKey("user.id"))
    phone: Mapped[str] = mapped_column(String(20))
    User: Mapped[User] = relationship(back_populates="user_extension")# 反向关系

一对多

from sqlalchemy import Integer, String, Text, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship

from . import Base
from .user import User


class Article(Base):
    __tablename__ = "article"
    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)#主键自增
    title: Mapped[str] = mapped_column(String(100))
    content: Mapped[str] = mapped_column(Text)
    author_id: Mapped[int] = mapped_column(Integer, ForeignKey("user.id")) #外键
    author: Mapped[User] = relationship(back_populates="articles")
    
    
# user.py

articles: Mapped[List["Article"]] = relationship(back_populates="author")

多对多

需要一个中间表

# article类
tags: Mapped[List["Tag"]] = relationship("Tag",back_populates="articles",secondary="article_tag")


class Tag(Base):
    __tablename__ = "tag"
    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
    name: Mapped[str] = mapped_column(String(100))
    articles: Mapped[List[Article]] = relationship("Article",back_populates="tags",secondary="article_tag")


class ArticleTag(Base):
    __tablename__ = "article_tag"
    article_id: Mapped[int] = mapped_column(Integer, ForeignKey("article.id"),primary_key= True)
    tag_id: Mapped[int] = mapped_column(Integer, ForeignKey("tag.id"),primary_key= True)