三十七:数据库之SQLAlchemy外建之多对多关系
2024-08-31 16:19:23
准备工作
from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship, backref # 数据库信息
host = '127.0.0.1'
port = '3306'
database = 'db_to_sqlalchemy'
username = 'root'
password = '123456' # 数据库类型+连接数据库的插件,这里使用的pymysql
DB_URI = f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}' engine = create_engine(DB_URI) # 创建引擎
Base = declarative_base(engine) # 使用declarative_base创建基类
session = sessionmaker(engine)()
多对多需要一张中间表来绑定关系
1、想把需要做多对多的模型定义出来
2、使用sqlalchemy.Table定义一个中间表,中间表一般就是包含两个模型的外建字段,并且把两个外建作为一个复合主键
3、在需要多对多的模型中任意选一个来定义relationship,绑定三者之间的关系,在使用relationship的时候需要传入secondary=中间表
from sqlalchemy import Table # 创建中间表
article_tag = Table(
'article_tag', # 中间表的表名
Base.metadata,
Column('article_id', Integer, ForeignKey('article.id'), primary_key=True), # 中间表的字段,来自外键
Column('tag_id', Integer, ForeignKey('tag.id'), primary_key=True), # 中间表的字段,来自外键
# 复合主键,防止数据冗余(两个都使用主键)
) class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
tags = relationship('Tag', backref='article', secondary=article_tag) # 关联中间表 def __repr__(self):
return f'Article(title: {self.title})' class Tag(Base):
__tablename__ = 'tag'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(50), nullable=False) def __repr__(self):
return f'Tag(name: {self.name})' Base.metadata.drop_all() # 删除所有表
Base.metadata.create_all() # 创建表
插入数据
article1 = Article(title='article1')
article2 = Article(title='article2') tag1 = Tag(name='tag1')
tag2 = Tag(name='tag2') article1.tags.append(tag1)
article1.tags.append(tag2) article2.tags.append(tag1)
article2.tags.append(tag2) session.add(article1)
session.add(article2) session.commit()
查询
最新文章
- C和指针 第十七章 二叉树删除节点
- .NET平台开源项目速览(7)关于NoSQL数据库LiteDB的分页查询解决过程
- java中的集合
- NSCharacter​Set在字符串操作中得使用
- js:方法1. 数组
- POJ 2186 Popular Cows --强连通分量
- 转自邓凡平 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第七章 深入理解Wi-Fi P2P部分节选
- rabbitMQ 笔记
- Android笔记之 文件保存、压缩与清空删除
- android实现计算器功能
- MYSQL 中的变量
- hbase:应用开发
- 用javascript实现2048的小游戏
- 一个苹果证书怎么多次使用——导出p12文件
- MongoDB 安装和配置
- while循环写3次用户名密码验证程序
- ConcurrentHashMap、synchronized与线程安全
- 10_Android中通过HttpUrlConnection访问网络,Handler和多线程使用,读取网络html代码并显示在界面上,ScrollView组件的使用
- mybatis使用<;choose>; <;when>;
- OSGI企业应用开发(二)Eclipse中搭建Felix运行环境
热门文章
- Linux编译阻塞型驱动遇到&#39;TASK_NORMAL&#39; undeclared (first use in this function)问题解决办法
- 牛客练习赛44 B	小y的线段 (思维)
- k8s master节点添加kubectl的使用
- 关于sparksql
- Acwing-120-防线(二分,前缀和)
- JAVA笔记8-对象转型casting
- 【leetcode】1271. Hexspeak
- JavaScript分支结构Ⅱ—switch-case
- Ant下载与配置
- SpringBoot项目中,异常拦截