Python 使用SQLAlchemy数据库模块
SQLAlchemy 是用Python编程语言开发的一个开源项目,它提供了SQL工具包和ORM对象关系映射工具,使用MIT许可证发行,SQLAlchemy 提供高效和高性能的数据库访问,实现了完整的企业级持久模型。
ORM(对象关系映射)是一种编程模式,用于将对象与关系型数据库中的表和记录进行映射,从而实现通过面向对象的方式进行数据库操作。ORM 的目标是在编程语言中使用类似于面向对象编程的语法,而不是使用传统的 SQL 查询语言,来操作数据库。
主要思想是将数据库表的结构映射到程序中的对象,通过对对象的操作来实现对数据库的操作,而不是直接编写 SQL 查询。ORM 工具负责将数据库记录转换为程序中的对象,反之亦然。
ORM 的核心概念包括:
- 实体(Entity): 在 ORM 中,实体是指映射到数据库表的对象。每个实体对应数据库中的一条记录。
- 属性(Attribute): 实体中的属性对应数据库表中的列。每个属性表示一个字段。
- 关系(Relationship): ORM 允许定义实体之间的关系,例如一对多、多对一、多对多等。这种关系会映射到数据库表之间的关系。
- 映射(Mapping): ORM 负责将实体的属性和方法映射到数据库表的列和操作。
- 会话(Session): ORM 提供了会话来管理对象的生命周期,包括对象的创建、更新和删除。
- 查询语言: ORM 通常提供一种查询语言,允许开发者使用面向对象的方式编写查询,而不是直接使用 SQL。
对象映射ROM模型可连接任何关系数据库,连接方法大同小异,以下总结了如何连接常用的几种数据库方式。
# sqlite 创建数据库连接 |
数据表创建
简单的创建一个User
映射类,映射到UserDB
库上,分别增加几个常用的数据库字段,并插入一些测试数据。
import sqlite3,datetime,time |
数据库查询
演示了通过ORM关系映射实现对单表的简单查询与筛选过滤功能。
import sqlite3,time,datetime |
数据库修改
演示了修改数据库参数以及对数据库指定记录的删除功能。
import sqlite3,time,datetime |
数据库查询转字典
将从数据库中过滤查询指定的记录,并将该记录转换为字典
或JSON
格式,利于解析。
import sqlite3,time,datetime,json |
数据库类内函数调用
用户在使用ORM模型定义类时,可以同时在该映射类中定义各种针对类模型的处理函数,实现对数据的动态处理
from werkzeug.security import generate_password_hash,check_password_hash |
数据库聚合函数
通过func库调用数据库内的聚合函数,实现统计最大最小平均数等数据。
import sqlite3,datetime,time |
ORM定义一对多关系
SQLAlchemy提供了一个relationship
,这个类可以定义属性,以后在访问相关联的表的时候就直接可以通过属性访问的方式就可以访问得到。
from sqlalchemy.orm import sessionmaker |
ORM定义一对一关系
如果想要将两个模型映射成一对一的关系,那么应该在父模型中,指定引用的时候,要传递一个uselist=False
参数进去。就是告诉父模型,以后引用这个从模型的时候,不再是一个列表了,而是一个对象了。
from sqlalchemy.ext.declarative import declarative_base |
ORM定义多对多关系
多对多与上面的一对多,一对一不同,创建多对对必须使用中间表Table
来解决查询问题。
- 多对多的关系需要通过一张中间表来绑定他们之间的关系。
- 先把两个需要做多对多的模型定义出来
- 使用Table定义一个中间表,中间表一般就是包含两个模型的外键字段就可以了,并且让他们两个来作为一个“复合主键”。
- 在两个需要做多对多的模型中随便选择一个模型,定义一个relationship属性,来绑定三者之间的关系,在使用relationship的时候,需要传入一个secondary=中间表。
from sqlalchemy.ext.declarative import declarative_base |
连接查询与子查询
连接查询通过JOIN
语句实现,子查询则通过subquery
实现,首先需要创建一对多关系
然后才可使用子查询。
from sqlalchemy.orm import sessionmaker |