当前位置: 首页 > news >正文

SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具

在这里插入图片描述


SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具

  • 一、SQLAIchemy的介绍
  • 二、数据库引擎
    • 1、支持的数据库
      • 1.1、sqlite数据库
      • 1.2、MySQL数据库
      • 1.3、数据库引擎的参数
  • 三、定义模型类
    • 1、定义模型
    • 2、engine负责数据库迁移
  • 四、alembic数据库迁移⼯具
    • 1、安装alembic
    • 2、初始化alembic环境
    • 3、修改配置和环境
    • 4、执⾏命令

一、SQLAIchemy的介绍

SQLAlchemy 是 Python 生态系统中最流行的 ORM。SQLAlchemy 设计非常优雅,分为了两部分——底层的 Core 和上层的传统ORM。在 Python 乃至其他语言的大多数 ORM 中,都没有实现很好的分层设计,比如 django 的 ORM,数据库链接和 ORM 本身完全混在一起。

在这里插入图片描述

SQLAlchemy 是 Python 中一个通过 ORM 操作数据库的框架。
SOLAIchemy对象关系映射器提供了一种方法,用于将用户定义的Python类与数据库表相关联,并将这些类(对象)的实例与其对应表中的行相关联。它包括一个透明地同步对象及其相关行之间状态的所有变化的系统,称为工作单元,以及根据用户定义的类及其定义的彼此之间的关系表达数据库查询的系统。

可以让我们使用类和对象的方式操作数据库,从而从繁琐的 sql语句中解脱出来。
ORM 就是: Obiect Relational Mapper 的简写,就是关系对象映射器的意思。

在这里插入图片描述

二、数据库引擎

任何SQLAlchemy应用程序的开始都是一个名为 Engine.此对象充当连接到特定数据库的中心源,提供工厂和称为 connection pool对于这些数据库连接。引擎通常是一个只为特定数据库服务器创建一次的全局对象,并使用一个URL字符串进行配置,该字符串将描述如何连接到数据库主机或后端。

在这里插入图片描述
sqlalchemy使用create_engine()函数从URL生成一个数据库引擎对象。例如:

engine=create_engine(r"sqlite:///C:\path\to\foo.db")

1、支持的数据库

URL通常可以包括⽤⼾名、密码、主机名、数据库名以及⽤于其他配置的可选关键字参数。主题格式
为:

1.1、sqlite数据库

sqlite使⽤python内置模块连接到基于⽂件的数据库sqlite3 默认情况下。

在这里插入图片描述

1.2、MySQL数据库

mysql⽅⾔使⽤mysql python作为默认dbapi。mysql dbapis有很多,包括pymysql和mysqlclient:
在这里插入图片描述

from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://root:root@localhost:3306/test_db2?charset=utf8')

1.3、数据库引擎的参数

  1. echo=False–如果为真,引擎将记录所有语句以及repr()其参数列表的默认⽇志处理程序
  2. future --使⽤2.0样式Engine和Connection API。
  3. logging_name–将在“sqlalChemy.engine”记录器中⽣成的⽇志记录的“name”字段中使⽤的
    字符串标识符。
  4. pool_size=5 #连接池的⼤⼩默认为5个,设置为0时表⽰连接⽆限制
  5. pool_recycle=3600,#设置时间以限制数据库⾃动断开
  6. pool_timeout:连接超时时间,默认为30秒,超过时间的连接都会连接失败。

三、定义模型类

这种模型类结构称为声明性映射,它同时定义了 Python 对象模型,以及描述的数据库元数据 在特定数据库中存在或将要存在的
真实 数据库 表。
映射从一个基类开始,并且是 通心对类的继承来创建一个简单的子类。这里的父类是:Base 模型类。

1、定义模型

# 定义一个模型类的基类
class Base(DeclarativeBase):# 所有的模型类都有的属性和字段映射create_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), comment="创建时间")update_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), onupdate=func.now(),comment="更新时间")
import enum
from decimal import Decimalfrom sqlalchemy import String, DECIMAL, Boolean
from sqlalchemy.orm import Mapped, mapped_columnfrom ch04.db_main import Base, engineclass SexValue(enum.Enum):"""通过枚举,可以给一些属性(字段)设置预设值"""MALE = "男"FEMALE = "女"class Employee(Base):"""员工的模型类"""__tablename__ = "t_emp"id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)name: Mapped[str] = mapped_column(String(40), name="emp_name", unique=True, nullable=False)  # 不允许为空# DECIMAL:10:总位数,2:小数点后位数sal: Mapped[Decimal] = mapped_column(DECIMAL(10, 2), nullable=True, comment="员工的基本薪资")bonus: Mapped[int] = mapped_column(default=0, comment="员工的津贴")is_leave: Mapped[bool] = mapped_column(Boolean, default=False, comment="员工是否离职,True表示离职,False表示在职")gender: Mapped[SexValue]if __name__ == '__main__':# 数据库迁移# 创建表Base.metadata.create_all(engine)

在这里插入图片描述
在这里插入图片描述

2、engine负责数据库迁移

# 所有的表都重新创建 
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
# 单独把某个表创建⼀下 
Employee.__table__.drop(engine)
Employee.__table__.create(engine)

四、alembic数据库迁移⼯具

Alembic使⽤SQLAlchemy作为底层引擎,为关系数据库提供变更脚本的创建、管理和调⽤。

1、安装alembic

pip install alembic

2、初始化alembic环境

命令:alembic init alembic
在这里插入图片描述

3、修改配置和环境

在这里插入图片描述
在这里插入图片描述

4、执⾏命令

# ⾃动⽣成迁移脚本 
alembic revision --autogenerate -m "init commit" # 注意修改了orm之后,修改-m后迁移脚
# 数据库迁移命令 
alembic upgrade head

在这里插入图片描述
查看数据库的版本号与versions中生成的版本号一致
在这里插入图片描述

• alembic upgrade head :将数据库升级到最新版本。
• alembic downgrade base :将数据库降级到最初版本。
• alembic upgrade :将数据库升级到指定版本。
• alembic downgrade :将数据库降级到指定版本。

演示版本降级:
在这里插入图片描述

http://www.lryc.cn/news/532363.html

相关文章:

  • [含文档+PPT+源码等]精品基于Python实现的django个性化健康餐计划订制系统
  • Python3中异常处理:try/except语句
  • [ Spring] Integrate Spring Boot Dubbo with Nacos 2025
  • 【3分钟极速部署】在本地快速部署deepseek
  • 【QT笔记】使用QScrollArea实现多行文本样式显示
  • 大模型中提到的超参数是什么
  • 【Uniapp-Vue3】z-paging插件组件实现触底和下拉加载数据
  • UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理
  • OKHttp拦截器解析
  • STM32标准库移植RT-Thread nano
  • c++11总结26——std::regex
  • langchain教程-12.Agent/工具定义/Agent调用工具/Agentic RAG
  • leetcode_双指针 125.验证回文串
  • ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练
  • 【华为OD机考】华为OD笔试真题解析(1)--AI处理器组合
  • edu小程序挖掘严重支付逻辑漏洞
  • 力扣 279. 完全平方数
  • 鸿蒙生态潮起:开发者的逐浪之旅
  • Diskgenius系统迁移之后无法使用USB启动
  • Kafka 可靠性探究—副本刨析
  • 我的博文天地测试报告
  • EtherCAT主站IGH-- 35 -- IGH之pdo_list.h/c文件解析
  • 嵌入式开发神器:Buildroot的介绍和使用方法
  • JavaScript系列(61)--边缘计算应用开发详解
  • 【LeetCode】day15 142.环形链表II
  • 代理对象与目标对象
  • 【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信
  • DNN(深度神经网络)近似 Lyapunov 函数
  • 128陷阱
  • PromptSource和LangChain哪个更好