Python全系列 教程
3567个小节阅读:5929.5k
目录
鸿蒙应用开发
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
多对多的关系需要通过一张中间表来绑定他们之间的关系。
先把两个需要做多对多的模型定义出来
使用Table定义一个中间表,中间表一般就是包含两个模型的外键字段就可以了,并且让他们两个来作为一个“复合主键”
在两个需要做多对多的模型中随便选择一个模型,定义一个relationship属性,来绑定三者之间的关系,在使用relationship的时候,需要传入一个secondary=中间表对象名
xxxxxxxxxx
from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy import Table
from sqlalchemy.orm import relationship,backref
from db_util import Base,Session
# 创建第3张表,来建立多对多关系
# 放到2个模型之上
news_tag = Table(
't_news_tag',
Base.metadata,
Column('news_id',Integer,ForeignKey('t_news.id'),primary_key = True),
Column('tag_id',Integer,ForeignKey('t_tag.id'),primary_key = True),
)
class News(Base):
__tablename__ = 't_news'
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(32),nullable=False)
tags = relationship('Tag',backref='newss',secondary = news_tag)
def __repr__(self):
return f'<News: id={self.id} title={self.title}>'
class Tag(Base):
__tablename__ = 't_tag'
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(32),nullable=False)
# news = relationship('News',backref='tags',secondary = news_tag)
def __repr__(self):
return f'<Tag: id={self.id} name={self.name}>'
def create_data():
news1 = News(title = 'Python更新了!')
news2 = News(title = 'SQLAlchemy功能又强大了!')
tag1 = Tag(name = 'IT新闻')
tag2 = Tag(name = '科学技术')
news1.tags.append(tag1)
news1.tags.append(tag2)
news2.tags.append(tag1)
news2.tags.append(tag2)
with Session() as ses:
ses.add(news1)
ses.add(news2)
ses.commit()
def query_data():
with Session() as ses:
news = ses.query(News).first()
print(news.tags)
if __name__ == '__main__':
# Base.metadata.create_all()
# create_data()
query_data()
实时学习反馈
1. 在SQLAlchemy中,对多对多表关系说法正确的是?
A 需要在2表中的字段都使用relationship
B 需要在2表中的字段都使用ForeignKey
C 需要单独创建一个Table对象,外键字段使用2表的主键即可
D 需要单独创建一个Table对象,2个外键字段,必须是组合主键
答案
1=>C