1.数据库的连接、创建会话与模型

news/2024/7/7 19:45:39/文章来源:https://www.cnblogs.com/gupingan/p/18282769

SQLAlchemy 是一个强大的 Python 库,它让你可以用一种面向对象的方式来操作数据库(ORM 技术)。

在学习 SQLAlchemy 的过程中,需要一些基础知识的沉淀:Python基础、Python面向对象、MySQL数据库的诸多知识点……

在此之前,你可能需要了解传统执行SQL语句和使用ORM的一些区别以及他们的概念。

什么是传统执行 SQL?

传统执行 SQL 是指直接使用 SQL 语句与数据库进行交互。这通常包括连接数据库、编写 SQL 查询、执行查询以及处理结果。

特点

  1. 直接编写 SQL 语句:你需要手动编写 SQL 查询来操作数据库。
  2. 灵活性高:可以使用所有的 SQL 功能,精确控制查询和操作。
  3. 低级别控制:你需要管理数据库连接、事务处理等。

示例

import pymysql# 连接数据库
connection = pymysql.connect(host='localhost',user='root',password='0908',database='db_flask_demo_school',charset='utf8mb4'
)try:with connection.cursor() as cursor:# 执行 SQL 查询sql = "SELECT * FROM tb_student"cursor.execute(sql)result = cursor.fetchall()for row in result:print(row)
finally:connection.close()

什么是 ORM(对象关系映射)?

ORM 是一种通过面向对象的方式来操作数据库的技术。ORM 将数据库表映射为类,将表中的记录映射为类的实例,使得你可以用面向对象的方式来进行数据库操作。

特点

  1. 面向对象:使用类和对象来表示数据库表和记录。
  2. 自动生成 SQL:ORM 框架会根据你的操作自动生成相应的 SQL 语句。
  3. 简化代码:简化了数据库操作的代码,使得代码更易读、更易维护。

示例

from sqlalchemy import create_engine, Column, Integer, String, Boolean
from sqlalchemy.orm import declarative_base, sessionmaker# 创建数据库引擎
engine = create_engine('mysql+pymysql://root:0908@localhost:3306/db_flask_demo_school?charset=utf8mb4')
Base = declarative_base()# 定义模型
class Student(Base):__tablename__ = 'tb_student'id = Column(Integer, primary_key=True)name = Column(String(20))sex = Column(Boolean, default=True)age = Column(Integer)# 创建会话
SessionLocal = sessionmaker(bind=engine)
session = SessionLocal()# 查询数据
students = session.query(Student).all()
for student in students:print(student.name)

比较

特性 传统执行 SQL ORM
编写 SQL 语句 手动编写 自动生成
操作方式 直接操作数据库 面向对象操作
灵活性 高,完全控制 SQL 语句 中等,受限于 ORM 框架
代码简洁性 代码较冗长 代码简洁易读
学习曲线 需要掌握 SQL 语法 需要学习 ORM 框架的用法
性能 可能更高效,具体取决于 SQL 语句 可能稍慢,但差异通常不明显
维护性 低,SQL 语句分散在代码中 高,结构清晰,易于维护

适用场景

  • 传统执行 SQL:适用于需要精细控制 SQL 查询的场景,或者需要使用复杂的 SQL 特性的场景。
  • ORM:适用于需要快速开发、代码可读性和维护性要求高的场景。ORM 可以大大简化常见的数据库操作。

接下来进入 SQLAlchemy 的快速学习

1. 创建数据库驱动引擎

首先,我们需要创建一个数据库驱动引擎。当你连接数据库时,需要提前创建这个数据库。

CREATE DATABASE db_flask_demo_school CHARSET=utf8mb4

这个引擎就是你和数据库之间的桥梁。

from sqlalchemy import create_engineengine = create_engine(# url = '驱动://账户:密码@地址:端口/数据库名?charset=编码'url='mysql+pymysql://root:0908@localhost:3306/db_flask_demo_school?charset=utf8mb4',echo=True,  # 在控制台输出SQL语句,方便调试pool_size=8,  # 连接池的数据库连接数量max_overflow=30,  # 连接池的数据库连接最大数量pool_recycle=60 * 30,  # 设置秒数限制数据库多久没连接自动断开
)

2. 创建数据库会话

有了引擎之后,我们需要创建一个会话,这样才能和数据库进行交互。会话就像是你和数据库之间的对话窗口。

from sqlalchemy.orm import sessionmakerSessionLocal = sessionmaker(bind=engine)  # 工厂函数,创建新的会话类
session = SessionLocal()  # 实例化。用于与数据库进行交互

另一种创建会话的方式

from sqlalchemy.orm import Session# 目前官方文档上的案例使用的这种
# 大多数机构教学或者旧的学习资料中可能是上述方式
session = Session(bind=engine)

3. 定义模型基类

在 SQLAlchemy 中,模型是与数据库表对应的类。我们需要定义一个基类,所有的模型都将继承这个基类。

from sqlalchemy.orm import declarative_baseModel = declarative_base()

另一种创建基类的方式

from sqlalchemy.orm import DeclarativeBaseclass Model(DeclarativeBase):pass

该方式也是来源于目前官方文档的示例。

4. 创建模型

现在我们基于上方的模型基类,创建一个学生模型,这个模型对应数据库中的 tb_student 表。

每个模型类对应的其实就是数据库中的表,其中表名、字段都对应了类属性的设置,而每个类的实例对象也就是一条记录。

import db
import datetimeclass Student(db.Model):__tablename__ = 'tb_student'  #  数据表的名字# db.Column 是一个字段对象,对应表字段,接受很多很多的参数(没啥好记的,浪费大脑为数不多的空间,参见末尾的表),常用字段属性是字段类型、是否为主键、备注描述、默认值指定等等# 整型 + 主键 + 告知这是学生编号(默认自增)id = db.Column(db.Integer, primary_key=True, comment='学生编号')# 20位字符串 + 告知这是学生姓名name = db.Column(db.String(20), comment='学生姓名')# 布尔型(实际上存储是0或1),默认是 True(存储是1)sex = db.Column(db.Boolean, default=True, comment='学生性别')# 精度更小的整型age = db.Column(db.SmallInteger, comment='学生年龄')# 'class' 这里不是类型,而是别名,因为 class = xxx,在python中是不行的(关键字)class_ = db.Column('class', db.SMALLINT, comment='学生班级')# 文本类型description = db.Column(db.Text, comment='个性签名')# 布尔型,默认值也可以写成 1status = db.Column(db.Boolean, default=1, comment='登录状态')# 日期时间类型,默认值需要特别注意,引用了 datetime 库,使用的是 now函数的地址,而不是它的调用结果。如果使用调用结果,将以项目执行启动的时间为准addtime = db.Column(db.DateTime, default=datetime.datetime.now, comment='入学时间')orders = db.Column(db.SMALLINT, default=1, comment='学生排序')def __repr__(self):# 便于打印列表时,显示 [ <Student: 老王(12)>,...]return f'<{self.__class__.__name__}: {self.name}({self.id})>'def to_dict(self):# 便于对象直接转成字符串,实现方式很多,比如 __dict__ 拷贝一份,然后筛选非'_'字符开头的键也行。return {'id': self.id,'name': self.name,'sex': self.sex,'age': self.age,'class': self.class_,'description': self.description,'status': self.status,'addtime': self.addtime.strftime('%Y-%m-%d %H:%M:%S'),  # 需要注意获取到的是 DateTime 对象,参见 datetime 库'orders': self.orders,}if __name__ == '__main__':# 建表操作,如果如果你所在的公司或者团队或者你自身负责数据库的设计(DBA),那么建表无需执行 create_all# 当然,也有一些坑13,如果没有为你建表甚至没有设计,emmmm……,那就自己来吧!db.Model.metadata.create_all(db.engine)

附表:常用 Column 字段

下面是一个详细的 SQLAlchemy Column 类型及其参数的表格,包括字段的用途、存储到数据库的类型、Python 中表示的数据类型等信息。

字段类型 参数示例 用途 数据库类型 Python 类型
Integer Column(Integer, primary_key=True) 存储整数 INTEGER int
String Column(String(50), nullable=False) 存储字符串 VARCHAR str
Text Column(Text) 存储大文本数据 TEXT str
Boolean Column(Boolean, default=True) 存储布尔值 BOOLEAN bool
DateTime Column(DateTime, default=datetime.datetime.now) 存储日期和时间 DATETIME datetime.datetime
Float Column(Float) 存储浮点数 FLOAT float
SmallInteger Column(SmallInteger) 存储小范围整数 SMALLINT int
LargeBinary Column(LargeBinary) 存储二进制数据 BLOB bytes
Numeric Column(Numeric(10, 2)) 存储精确的小数 NUMERIC decimal.Decimal
Date Column(Date) 存储日期 DATE datetime.date
Time Column(Time) 存储时间 TIME datetime.time
Enum Column(Enum('value1', 'value2')) 存储枚举值 ENUM enum.Enum
Interval Column(Interval) 存储时间间隔 INTERVAL datetime.timedelta
JSON Column(JSON) 存储 JSON 数据 JSON dict
UUID Column(UUID(as_uuid=True)) 存储 UUID UUID uuid.UUID
ARRAY Column(ARRAY(String)) 存储数组 ARRAY list
JSONB Column(JSONB) 存储 JSONB 数据(PostgreSQL) JSONB dict
HSTORE Column(HSTORE) 存储键值对(PostgreSQL) HSTORE dict
INET Column(INET) 存储 IP 地址(PostgreSQL) INET str
CIDR Column(CIDR) 存储 IP 地址范围(PostgreSQL) CIDR str
MACADDR Column(MACADDR) 存储 MAC 地址(PostgreSQL) MACADDR str

常用 Column 参数

  • primary_key:是否为主键。
    • 类型bool
    • 默认值False
    • 示例Column(Integer, primary_key=True)
  • nullable:是否允许为空。
    • 类型bool
    • 默认值True
    • 示例Column(String, nullable=False)
  • default:默认值。
    • 类型any
    • 默认值None
    • 示例Column(Boolean, default=True)
  • unique:是否唯一。
    • 类型bool
    • 默认值False
    • 示例Column(String, unique=True)
  • index:是否创建索引。
    • 类型bool
    • 默认值False
    • 示例Column(String, index=True)
  • comment:字段注释。
    • 类型str
    • 默认值None
    • 示例Column(String, comment='用户名')
  • autoincrement:是否自动递增(通常用于主键)。
    • 类型boolstr(好像是auto表示自增吧,忘记了,可查文档)
    • 默认值True(在主键列上)
    • 示例Column(Integer, primary_key=True, autoincrement=True)
  • server_default:数据库服务器端的默认值。
    • 类型DefaultClausestr
    • 默认值None
    • 示例Column(String, server_default='default_value')
  • server_onupdate:数据库服务器端的更新值。
    • 类型DefaultClausestr
    • 默认值None
    • 示例Column(DateTime, server_onupdate=func.now())
  • onupdate:更新时的默认值。
    • 类型any
    • 默认值None
    • 示例Column(DateTime, onupdate=datetime.datetime.now)
  • foreign_key:外键约束。
    • 类型ForeignKey
    • 默认值None
    • 示例Column(Integer, ForeignKey('other_table.id'))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/737109.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[大疆航线] 系列(3) 无人机多角度航线规划软件μMAPLE

关键词:无人机航线、航点动作,航线软件 作者:ludwig1860 日期:2024.7.3 1. 多角度航线规划软件μMAPLE的编写 我们研究团队编写了一个名为μMAPLE (uav-based Multi-Angular flight PLannEr)的多角度航线规划软件。当然,我们也很乐意协助研究人员们开发符合各自需求的航线…

Windows Terminal 中设置常用命令的别名

Windows Terminal 中设置常用命令的别名 ‍ E:\zhpj\Desktop>cmd /? 启动 Windows 命令解释器的一个新实例 . . . 如果 /D 未在命令行上被指定,当 CMD.EXE 开始时,它会寻找 以下 REG_SZ/REG_EXPAND_SZ 注册表变量。如果其中一个或 两个都存在,这两个变量会先被执行。HKE…

ssrf结合python反序列化

存储session对象时 当然不能直接存储对象 需要转换成有规律的字符串 这一过程就涉及到了序列化 将对象转换成字符串这一过程称之为序列化 PYTHON反序列化漏洞 本文中就涉及到了pickle这一序列化模块导致的反序列化漏洞 在反序列化结束时 会触发__reduce__魔术方法 类似于php中的…

Web基础知识扫盲

1、中间件 定义:中间件是一种独立的系统软件服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。常见的中间件:IIS、Apache、Nginx、Tomcat 2、NAT网络地址转换 这里只介绍动态转换一种 动态转换…

MySQL-16.MVCC(多版本并发控制)

C-16.多版本并发控制 1.什么是MVCCMVCC(Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之,就是为了查询一些正在被另一事务更…

[JLU] 数据结构与算法上机题解思路分享-课程设计第一次与第二次上机

这是吉林等通知大学数据结构与算法上机题的题解思路,没有精妙的解法,只是一个记录罢前言 首先,请务必自己尽全力尝试实现题目,直接看成品代码,思维就被拘束了,也很容易被查重。 这里只是思路解析的博客,代码仓库在 JLU_Data_Structures_Record 希望你能在这里找到你想要…

【Python】GUI开发笔记

一、环境搭建: 1、Pycharm开发工具pycharm历史版本 https://www.jetbrains.com/pycharm/download/other.html破解插件 https://blog.csdn.net/weixin_50737119/article/details/135628513 2、PYENV 版本管理 Python也有对应的版本管理工具,叫pyenv 这个东西挺奇怪的,直接发…

Day1| 704. 二分查找 27. 移除元素

704.二分查找 题目链接 : https://leetcode.cn/problems/binary-search/description/ 思路😗*切记二分查找要基于排序好的数组或者数据,否则二分查找必不能使用!!!!!!!!! ** 双指针写最简单,一个头指针从0开始,一个尾指针从数组长度-1开始,中间指针是头+尾/2,每次比较头尾中间…

不同操作系统下的换行符

1. 关键字 2. 换行符的比较 3. ASCII码 4. 修改换行符4.1. VSCode5. 参考文档1. 关键字 CR LF CRLF 换行符 2. 换行符的比较英文全称 英文缩写 中文含义 转义字符 ASCII码值 操作系统Carriage Return CR 回车 \r 13 MacIntosh(早期的Mac)Linefeed LF 换行/新行 \n 10 Unix/Li…

1s内控制向某个请求请求的次数

背景 有的时候后端提供的接口对相同的IP进行限制,在某个时间内不能发送超过X条的请求,一旦超过指定的请求数会导致后续请求接口会出现异常。 效果需求 比如:在1s内最多同时发送2个请求,多出来的请求在后续的1s或者后续的Ns中发起 代码 <template><div class="…

电脑hold escape key to prevent startlsback怎么处理?

电脑出现hold escape key to prevent StartlsBack from,一般遇到这种问题之后,一直按住ESC键就没有了。但是还需彻底的解决掉这个问题。 首先我们按下“ctrl +alt +del”组合键打开任务管理器,左上角“运行新任务”,输入“control”并确定,就可以打开控制面板,查看方式为…

7.3日RTOS自学心得

我现在用的单片机主要是裸机系统,轮询系统和前后台系统(中断处理),但是为了以后的职业发展肯定还是要学习下操作系统的,也就是多任务系统FreeRTOS,在看野火的资料【[野火]uCOS-III 内核实现与应用开发实战指南】,学习到了第六章,任务的定义与任务切换的实现。 总结如下…

fisher线性判别分析和多分类问题探究

本文继续来讨论另一种分类模型————fisher线性判别分析 目录一、模型思想二、SPSS的实现1.参数设置(1)定义范围(2) 统计(3)保存与分类2.结果分析(1)典则判别函数系数(2)分类结果(3)分类函数系数(4)保存预测结果四、多分类问题 一、模型思想 我们以二分类问题举例…

[Paper Reading] GAIA-1: A Generative World Model for Autonomous Driving

GAIA-1: A Generative World Model for Autonomous Driving GAIA-1 时间:23.09 机构:Wayve TL;DR 本文介绍一种生成世界模型,该模型利用视频、文本和动作输入来生成逼真的驾驶场景,同时提供对自身车辆行为和场景特征的细粒度控制。 Method模型输入 训练过程输入video/text(…

进度报告1

(1)1.在黑马程序员中找到java的教学网课,初步学习了Java语言的概述以及完成了java的开发环境搭建,成功安装了jdk并且利用命令行窗口顺利验证java和javac是否正常安装并且能使用。2.编写入门代码helloworld代码:public class HelloWorld{ public static void main(String[]…

模拟集成电路设计系列博客——8.4.2 时间-数字转换器

8.4.2 时间-数字转换器 在上一节我们介绍了TDC的一种典型实现,即单延时链TDC,通过\(2^N\)的延迟单元和D触发器可以实现N bit的时间数字转换功能,但这种结构的分辨率受到延迟单元的最小延迟时间限制,即: \[LSB=\tau_{delay}=\frac{T}{2^N} \tag{8.4.10} \]其中\(T\)为TDC的…

聊一聊领域驱动与贫血模型

写在前面 前段时间跟领导讨论技术债概念时不可避免地提到了代码的质量,而影响代码质量的因素向来都不是单一的,诸如项目因素、管理因素、技术选型、人员素质等等,因为是技术债务,自然就从技术角度来分析,单纯从技术角度来看代码质量,其实又细分很多原因,如代码设计、代码…

《智能计算系统》第五章 编程框架原理(上)课程笔记

《智能计算系统》第五章 编程框架原理(上)课程视频链接:https://www.bilibili.com/video/BV1Ei421i7Rg 本文源自于B站国科大计算所 智能计算系统课程官方账号 所公开上传的视频,在原有视频之上,提取了关键帧、将音频转成了文字并进行了校正,以便学习使用。在此,也感谢国…

点云分割网络---Point Transformer V2

PDF: 《Point Transformer V2: Grouped Vector Attention and Partition-based Pooling》 CODE: https://github.com/Gofinge/PointTransformerV2 一、大体内容 前面一篇文章介绍了Point Transformer,这一篇在其基础上进行改进,提出了强大且高效的Point Transformer V2模型,…

【坚果识别】果实识别+图像识别系统+Python+计算机课设+人工智能课设+卷积算法

一、介绍 坚果识别系统,使用Python语言进行开发,通过TensorFlow搭建卷积神经网络算法模型,对10种坚果果实(杏仁, 巴西坚果, 腰果, 椰子, 榛子, 夏威夷果, 山核桃, 松子, 开心果, 核桃)等图片数据集进行训练,得到一个识别精度较高的模型文件,让后使用Django搭建Web网页端…