刘沙河 刘沙河
首页
  • Go语言基础

    • 数据类型
    • 反射
    • Go指针
  • Go语言进阶

    • go泛型
    • go条件编译
    • cgo教程
    • Go协程调度原理及GPM模型
    • Go内存管理
    • Go垃圾回收机制
    • Go语言内存对齐
  • Go语言实现原理

    • channel 实现原理
    • slice 实现原理
    • map 实现原理
    • sync.Mutex 实现原理
    • 乐观锁CAS 实现原理
    • singlefight 实现原理
  • gin框架

    • gin中间件原理
    • gin路由原理
  • gorm

    • GORM介绍和使用
    • GORM_CURD操作指南
  • go测试

    • benchmark基准测试
    • pprof 性能分析
  • python进阶

    • Numpy&Pandas
    • celery分布式任务队列
  • Django

    • Django 常见命令
    • middleware中间件
    • Django缓存系统
    • Django信号系统
    • Django REST Framework
  • Flask

    • Flask基础知识总结
    • Flask-SQLAlchemy
  • 爬虫

    • aiohttp
    • scrapy框架
  • Mysql

    • Mysql存储引擎和索引
    • MySQL主从复制
    • Mysql读写分离
    • 数据库分库分表
    • Mysql锁
    • Mysql事务和MVCC原理
    • 分库分表带来的读扩散问题
  • Redis

    • redis基础和数据类型
    • redis主从架构
    • redis哨兵架构
    • redis集群模式
    • 如何保证缓存和数据库双写一致
    • redis底层数据结构
    • redis分布式锁
  • Elasticsearch

    • es基本概念
    • es基础语法
    • es倒排索引
  • etcd

    • Go操作etcd
    • Raft原理
    • etcd分布式锁
  • kafka

    • 消息队列MQ总结
    • kafka 概述及原理
    • kafka 消费问题记录
    • 零拷贝技术
    • kafka分区规范
  • RabbitMQ

    • rabbitMQ基础
    • Go操作rabbitmq
  • RocketMQ

    • 可靠消息队列 rocketMQ
  • Http&Https

    • http&https
    • TCP和UDP
    • Ping 原理
  • RPC

    • RPC初识
    • grpc初识和实现
  • gRPC

    • grpc 初识
    • grpc 上下文 metadata
    • grpc 健康检查
    • grpc keepalive
    • grpc 命名解析
    • grpc 中间件&拦截器
    • grpc 负载均衡
    • grpc 身份认证
    • grpc 超时重试
    • grpc 链路追踪
    • grpc-gw将gRPC转RESTfu api
    • grpc-gw自定义选项
  • protobuf

    • protobuf 进阶
    • protobuf 编码原理
  • Docker

    • Docker基础
    • Docker常用命令
    • Dockerfile
    • Docker-Compose
    • Docker多阶段构建
    • Docker Config 教程
    • Docker Swarm 教程
    • Docker Stack 教程
    • Docker Buildx 教程
  • k8s

    • k8s 基础概念
    • k8s 集群架构
    • k8s 工作负载
    • Pod 网络
    • Service 网络
    • 外部接入网络
    • 一张图搞懂k8s各种pod
    • k8s 存储抽象
    • mac快速启动k8s
    • 自制申威架构k8s-reloader
  • go-kit

    • go-kit初识
    • go-kit启动http服务
    • go-kit集成gin启动服务
    • go-kit集成grpc和protobuf
    • go-kit中间件
    • go-kit服务注册发现与负载均衡
    • go-kit限流和熔断
    • go-kit链路追踪
    • go-kit集成Prometheus
  • 设计模式

    • 初识设计模式
    • 创建型模式
    • 结构型模式
    • 行为模式
  • 数据结构

    • 时间轮
    • 堆、双向链表、环形队列
    • 队列:优先队列
    • 队列:延迟队列
  • 算法

    • 递归算法
    • 枚举算法
    • 动态规划
    • 回溯算法
    • 分治算法
    • 贪心算法
    • LRU和LFU
    • 一致性哈希

花开半夏,半夏花开
首页
  • Go语言基础

    • 数据类型
    • 反射
    • Go指针
  • Go语言进阶

    • go泛型
    • go条件编译
    • cgo教程
    • Go协程调度原理及GPM模型
    • Go内存管理
    • Go垃圾回收机制
    • Go语言内存对齐
  • Go语言实现原理

    • channel 实现原理
    • slice 实现原理
    • map 实现原理
    • sync.Mutex 实现原理
    • 乐观锁CAS 实现原理
    • singlefight 实现原理
  • gin框架

    • gin中间件原理
    • gin路由原理
  • gorm

    • GORM介绍和使用
    • GORM_CURD操作指南
  • go测试

    • benchmark基准测试
    • pprof 性能分析
  • python进阶

    • Numpy&Pandas
    • celery分布式任务队列
  • Django

    • Django 常见命令
    • middleware中间件
    • Django缓存系统
    • Django信号系统
    • Django REST Framework
  • Flask

    • Flask基础知识总结
    • Flask-SQLAlchemy
  • 爬虫

    • aiohttp
    • scrapy框架
  • Mysql

    • Mysql存储引擎和索引
    • MySQL主从复制
    • Mysql读写分离
    • 数据库分库分表
    • Mysql锁
    • Mysql事务和MVCC原理
    • 分库分表带来的读扩散问题
  • Redis

    • redis基础和数据类型
    • redis主从架构
    • redis哨兵架构
    • redis集群模式
    • 如何保证缓存和数据库双写一致
    • redis底层数据结构
    • redis分布式锁
  • Elasticsearch

    • es基本概念
    • es基础语法
    • es倒排索引
  • etcd

    • Go操作etcd
    • Raft原理
    • etcd分布式锁
  • kafka

    • 消息队列MQ总结
    • kafka 概述及原理
    • kafka 消费问题记录
    • 零拷贝技术
    • kafka分区规范
  • RabbitMQ

    • rabbitMQ基础
    • Go操作rabbitmq
  • RocketMQ

    • 可靠消息队列 rocketMQ
  • Http&Https

    • http&https
    • TCP和UDP
    • Ping 原理
  • RPC

    • RPC初识
    • grpc初识和实现
  • gRPC

    • grpc 初识
    • grpc 上下文 metadata
    • grpc 健康检查
    • grpc keepalive
    • grpc 命名解析
    • grpc 中间件&拦截器
    • grpc 负载均衡
    • grpc 身份认证
    • grpc 超时重试
    • grpc 链路追踪
    • grpc-gw将gRPC转RESTfu api
    • grpc-gw自定义选项
  • protobuf

    • protobuf 进阶
    • protobuf 编码原理
  • Docker

    • Docker基础
    • Docker常用命令
    • Dockerfile
    • Docker-Compose
    • Docker多阶段构建
    • Docker Config 教程
    • Docker Swarm 教程
    • Docker Stack 教程
    • Docker Buildx 教程
  • k8s

    • k8s 基础概念
    • k8s 集群架构
    • k8s 工作负载
    • Pod 网络
    • Service 网络
    • 外部接入网络
    • 一张图搞懂k8s各种pod
    • k8s 存储抽象
    • mac快速启动k8s
    • 自制申威架构k8s-reloader
  • go-kit

    • go-kit初识
    • go-kit启动http服务
    • go-kit集成gin启动服务
    • go-kit集成grpc和protobuf
    • go-kit中间件
    • go-kit服务注册发现与负载均衡
    • go-kit限流和熔断
    • go-kit链路追踪
    • go-kit集成Prometheus
  • 设计模式

    • 初识设计模式
    • 创建型模式
    • 结构型模式
    • 行为模式
  • 数据结构

    • 时间轮
    • 堆、双向链表、环形队列
    • 队列:优先队列
    • 队列:延迟队列
  • 算法

    • 递归算法
    • 枚举算法
    • 动态规划
    • 回溯算法
    • 分治算法
    • 贪心算法
    • LRU和LFU
    • 一致性哈希
  • Python基础

  • Python进阶

    • 并发,并行同步,异步阻塞,非阻塞
    • 数据类型小结(各数据类型常用操作)
    • 数据分析 NumPy-Pandas
    • APScheduler定时任务框架
    • celery分布式任务队列
    • Django-celery
    • Django-crontab
    • gensim模块中Lsi模型自然语言处理
    • SQLalchemy 使用教程
      • 前戏:
      • 1.单表操作
        • 1.1创建表
        • 1.2CURD(增删改查)
      • 2.一对多
        • 2.1创建表
        • 2.2CURD
      • 3.多对多
        • 3.1 创建表
        • 3.2CURD
  • Python并发编程

  • Django

  • Flask

  • 爬虫

  • Python
  • Python进阶
bigox
2021-03-22
目录

SQLalchemy 使用教程

# SQLalchemy 使用教程

# 前戏:

​ 不用怀疑,你肯定用过Django中的orm,这个orm框架是django框架中自己封装的,在Django中配置和使用较为简单,但是并不适用于其他web框架,而今天说的sqlalchemy是兼容python语言的orm框架,相信你已经明白谁牛逼!

​ 下面,接下来....

​ 还有比案例更好的教程吗,那下面请您享用为您准备好的大餐...

# 1.单表操作

# 1.1创建表

  • 导入sqlachemy资源包

  • 案例

    from sqlalchemy.ext.declarative import declarative_base
    
    BaseModel = declarative_base()
    
    # 创建 Class / Table
    from sqlalchemy import Column,Integer,String
    
    class User(BaseModel):
        __tablename__ = "user" # 创建Table时名字
        id = Column(Integer,primary_key=True,autoincrement=True)
        name = Column(String(32),nullable=False,index=True,unique=True)
        # Column 定义数据列
        # int string 数据类型
    
    # 数据库引擎的创建:
    from sqlalchemy.engine import create_engine
    engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/dbname?charset=utf8") # 数据库连接驱动语句
    
    #利用 User 去数据库创建 user Table
    BaseModel.metadata.create_all(engine) # 数据库引擎
    # 数据库呢? 数据库服务器地址呢?
    # 数据库连接呢?
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

# 1.2CURD(增删改查)

  • 案例

    # 模拟 navcat 操作
    # 1.选择数据库
    from sqlalchemy.engine import create_engine
    engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s21?charset=utf8")
    # 2.选择表
    # 3.创建查询窗口
    from sqlalchemy.orm import sessionmaker
    select_db = sessionmaker(engine) # 选中数据库
    db_session = select_db() # 已经打开查询窗口
    # 4.写入SQL语句
    user = User(name="Alexander.DSB.Li") # == insert into user(`name`) value ("Alexander.DSB.Li")
    user_list = [User(name="Alex's Father"),User(name="李杰")]
    # 放入查询窗口
    db_session.add(user)
    db_session.add_all(user_list)
    # 5.提交sql语句
    db_session.commit()
    # 6.关闭查询窗口
    db_session.close()
    
    
    # 简单无条件查询
    # """
    # select * from user  table_user == class_User
    # """
    res = db_session.query(User).all() # 查询全部符合条件的数据
    res = db_session.query(User).first() # 查询符合条件的第一条数据
    print(res.id,res.name)
    
    # 简单条件查询
    # """
    # select * from user where id=3
    # """
    res = db_session.query(User).filter(User.id==3).all()
    print(res[0].id,res[0].name)
    res = db_session.query(User).filter_by(id=3).all()
    
    res = db_session.query(User).filter(User.id==3 , User.name == "123").all()
    print(res)
    #
    is_true_or_false = User.id==3 and User.name == "123"
    
    
    # 修改数据 update
    res = db_session.query(User).filter(User.id == 1).update({"name":"李亚历山大"})
    db_session.commit()
    db_session.close()
    
    # 删除数据
    res = db_session.query(User).filter(User.id == 2).delete()
    db_session.commit()
    db_session.close()
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52

# 2.一对多

# 2.1创建表

  • 案例

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Integer,String,ForeignKey
    from sqlalchemy.engine import create_engine
    
    #ORM精髓 relationship
    from sqlalchemy.orm import relationship
    
    engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s21?charset=utf8")
    BaseModel = declarative_base()
    
    # 一对多
    class School(BaseModel):
        __tablename__ = "school"
        id = Column(Integer,primary_key=True)
        name = Column(String(32),nullable=False)
    
    class Student(BaseModel):
        __tablename__ = "student"
        id = Column(Integer,primary_key=True)
        name = Column(String(32),nullable=False)
        sch_id = Column(Integer,ForeignKey("school.id"))
    
        # 关系映射
        stu2sch = relationship("School",backref="sch2stu")
    
    
    BaseModel.metadata.create_all(engine)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

# 2.2CURD

  • 使用案例

    from sqlalchemy.orm import sessionmaker
    from app01.static.上午.createForeignKey import engine
    
    select_db = sessionmaker(engine)
    db_session = select_db()
    
    # 增加数据
    # 先建立一个学校 再查询这个学校的id 利用这个ID 再去创建学生添加sch_id
    # relationship 正向添加 relationship字段出现在哪个类
    # stu = Student(name="DragonFire",stu2sch=School(name="OldBoyBeijing"))
    # stu sql 语句
    # db_session.add(stu)
    # db_session.commit()
    # db_session.close()
    
    # relationship 反向添加
    # sch = School(name="OldBoyShanghai")
    # sch.sch2stu = [
    #     Student(name="赵丽颖"),
    #     Student(name="冯绍峰")
    # ]
    #
    # db_session.add(sch)
    # db_session.commit()
    # db_session.close()
    
    
    # 查询 relationship 正向
    # res = db_session.query(Student).all()
    # for stu in res:
    #     print(stu.name,stu.stu2sch.name)
    
    # 查询 relationship 反向
    # res = db_session.query(School).all()
    # for sch in res:
    #     # print(sch.name,len(sch.sch2stu)) 学校里面有多少学生
    #     for stu in sch.sch2stu:
    #         print(sch.name,stu.name)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38

# 3.多对多

# 3.1 创建表

  • 案例

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Integer,String,ForeignKey
    from sqlalchemy.engine import create_engine
    from sqlalchemy.orm import relationship
    
    BaseModel = declarative_base()
    engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s21?charset=utf8")
    
    class Girl(BaseModel):
        __tablename__ = "girl"
        id = Column(Integer,primary_key=True)
        name = Column(String(32),nullable=False)
    
        gyb = relationship("Boy",backref="byg",secondary="hotel") # secondary="hotel" 数据表中的数据才能证明两者关系
    
    class Boy(BaseModel):
        __tablename__ = "boy"
        id = Column(Integer,primary_key=True)
        name = Column(String(32),nullable=False)
    
    class Hotel(BaseModel):
        __tablename__ = "hotel"
        id = Column(Integer,primary_key=True)
        bid = Column(Integer,ForeignKey("boy.id"))
        gid = Column(Integer,ForeignKey("girl.id"))
    
    
    BaseModel.metadata.create_all(engine)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28

# 3.2CURD

  • 案例

    from sqlalchemy.orm import sessionmaker
    from app01.static.上午.createM2M import engine
    
    select_db = sessionmaker(engine)
    db_session = select_db()
    
    # 增加数据 relationship 正向添加
    # g = Girl(name="赵丽颖",gyb=[Boy(name="DragonFire"),Boy(name="冯绍峰")])
    # db_session.add(g)
    # db_session.commit()
    # db_session.close()
    
    # 增加数据 relationship 反向添加
    # b = Boy(name="李杰")
    # b.byg = [
    #     Girl(name="罗玉凤"),
    #     Girl(name="朱利安"),
    #     Girl(name="乔碧萝")
    # ]
    #
    # db_session.add(b)
    # db_session.commit()
    # db_session.close()
    
    
    # 查询 relationship 正向
    # res = db_session.query(Girl).all()
    # for g in res:
    #     print(g.name,len(g.gyb))
    
    
    # 查询 relationship 反向
    # res = db_session.query(Boy).all()
    # for b in res:
    #     print(b.name,len(b.byg))
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
#Python#
上次更新: 2023/04/16, 18:35:33
gensim模块中Lsi模型自然语言处理
并发编程初识

← gensim模块中Lsi模型自然语言处理 并发编程初识→

最近更新
01
go与http代理
05-24
02
自制申威架构k8s-reloader
12-06
03
Docker Buildx 教程
12-01
更多文章>
Theme by Vdoing | Copyright © 2020-2024 小刘扎扎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式