准备工作

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()

查询

最新文章

  1. C和指针 第十七章 二叉树删除节点
  2. .NET平台开源项目速览(7)关于NoSQL数据库LiteDB的分页查询解决过程
  3. java中的集合
  4. NSCharacter​Set在字符串操作中得使用
  5. js:方法1. 数组
  6. POJ 2186 Popular Cows --强连通分量
  7. 转自邓凡平 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第七章 深入理解Wi-Fi P2P部分节选
  8. rabbitMQ 笔记
  9. Android笔记之 文件保存、压缩与清空删除
  10. android实现计算器功能
  11. MYSQL 中的变量
  12. hbase:应用开发
  13. 用javascript实现2048的小游戏
  14. 一个苹果证书怎么多次使用——导出p12文件
  15. MongoDB 安装和配置
  16. while循环写3次用户名密码验证程序
  17. ConcurrentHashMap、synchronized与线程安全
  18. 10_Android中通过HttpUrlConnection访问网络,Handler和多线程使用,读取网络html代码并显示在界面上,ScrollView组件的使用
  19. mybatis使用<choose> <when>
  20. OSGI企业应用开发(二)Eclipse中搭建Felix运行环境

热门文章

  1. Linux编译阻塞型驱动遇到'TASK_NORMAL' undeclared (first use in this function)问题解决办法
  2. 牛客练习赛44 B 小y的线段 (思维)
  3. k8s master节点添加kubectl的使用
  4. 关于sparksql
  5. Acwing-120-防线(二分,前缀和)
  6. JAVA笔记8-对象转型casting
  7. 【leetcode】1271. Hexspeak
  8. JavaScript分支结构Ⅱ—switch-case
  9. Ant下载与配置
  10. SpringBoot项目中,异常拦截