SQLAlchemy

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_engine

engine = 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 sessionmaker

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

另一种创建会话的方式

from sqlalchemy.orm import Session

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

3. 定义模型基类

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

from sqlalchemy.orm import declarative_base

Model = declarative_base()

另一种创建基类的方式

from sqlalchemy.orm import DeclarativeBase

class Model(DeclarativeBase):
    pass

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

4. 创建模型

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

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

import db
import datetime

class 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='个性签名')
    # 布尔型,认值也可以写成 1
    status = 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'))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实