【100天精通python】Day34:使用python操作数据库_ORM(SQLAlchemy)使用
目录
专栏导读
1 ORM 概述
2 SQLAlchemy 概述
3 ORM:SQLAlchemy使用
3.1 安装SQLAlchemy:
3.2 定义数据库模型类:
3.3 创建数据表:
3.4 插入数据:
3.5 查询数据:
3.6 更新数据:
3.7 删除数据:
3.8 关闭会话:
4 实战
设计一个简单的图书管理系统。
专栏导读

专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html

1 ORM 概述
ORM(对象关系映射)是一种编程技术,用于在关系型数据库和面向对象编程语言之间建立映射关系,使得数据库中的表和记录可以映射到编程语言中的对象和类。ORM的目标是简化数据库操作,使开发人员能够以面向对象的方式处理数据库。
在Python中,有多个ORM库可用,其中最知名的是SQLAlchemy。SQLAlchemy提供了一种将Python对象与数据库表之间建立映射关系的方式,允许开发人员使用Python类来操作数据库。
ORM的优势包括:
抽象化数据库操作:ORM隐藏了底层数据库的细节,开发人员可以更专注于业务逻辑,而不需要编写复杂的SQL查询。
面向对象编程:ORM允许开发人员使用面向对象的方式处理数据,使得代码更加清晰、可维护。
跨数据库支持:ORM库通常提供了跨多种数据库的支持,开发人员可以轻松切换数据库而不需要更改大量代码。
自动建表和迁移:ORM库可以自动根据定义的Python类生成数据库表,并支持数据库迁移。
查询生成器:ORM库通常提供了查询生成器,使得编写查询更加简单和直观。
事务管理:ORM库可以帮助管理事务,确保数据的一致性和完整性。
2 SQLAlchemy 概述
SQLAlchemy是一个强大的Python SQL工具包和对象关系映射(ORM)库,它允许开发人员使用Python编程语言与关系型数据库进行交互。SQLAlchemy提供了一种灵活且强大的方式来执行SQL查询、插入、更新、删除等操作,同时还支持将数据库表映射到Python类,使开发人员可以以面向对象的方式操作数据库。
以下是SQLAlchemy的主要特点和概述:
ORM功能:SQLAlchemy的核心特点之一是其ORM功能。它允许你通过定义Python类来映射数据库表和记录,将数据库操作转化为面向对象的操作,使代码更加直观和易于维护。
多种数据库支持:SQLAlchemy支持多种关系型数据库,包括MySQL、SQLite、PostgreSQL、Oracle等,允许开发人员在不同数据库之间切换而无需更改大部分代码。
灵活性:SQLAlchemy提供了多种方式来执行SQL操作,包括原始SQL查询、查询生成器以及ORM查询。这使得开发人员可以根据需求选择适合的方式。
连接池管理:SQLAlchemy支持连接池管理,可以在应用程序和数据库之间维护一组数据库连接,提高性能和效率。
事务管理:SQLAlchemy允许你使用事务管理来确保数据库操作的一致性和完整性,可以提交、回滚和中断事务。
数据库迁移:SQLAlchemy提供了Alembic工具,用于数据库迁移和版本管理,使得对数据库结构的变更更加可控。
多种关联:SQLAlchemy支持多种关联类型,如一对多、多对多等关联关系,使数据库之间的关系更加清晰。
跨表查询:SQLAlchemy允许在ORM查询中执行跨表联接,从而实现复杂的查询操作。
性能优化:SQLAlchemy提供了各种性能优化选项,如缓存、批量操作等,以提升大规模数据处理的效率。
丰富的文档和社区支持:SQLAlchemy拥有丰富的官方文档和活跃的社区,使得学习和解决问题变得更加容易。
总之,SQLAlchemy是一个强大的Python数据库工具包,适用于各种规模的项目,从小型应用到大型企业级系统。它的灵活性、面向对象的设计和多种功能使得它成为Python开发人员进行数据库操作的首选工具之一。
3 ORM:SQLAlchemy使用
当使用Python中的ORM(例如SQLAlchemy)时,你可以通过创建Python类来定义数据库模型,然后使用这些模型对象来执行数据库操作。以下是使用SQLAlchemy的详细示例:
3.1 安装SQLAlchemy:
首先,你需要安装SQLAlchemy库。你可以使用以下命令在终端中安装它:
pip install sqlalchemy
3.2 定义数据库模型类:
创建一个Python类来定义数据库模型。每个类表示一个表,类的属性表示表的列。
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base# 创建数据库连接
engine = create_engine('sqlite:///example.db')
Base = declarative_base()# 定义模型类
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)
3.3 创建数据表:
通过调用create_all()方法创建数据库表。
Base.metadata.create_all(engine)
3.4 插入数据:
创建一个模型对象,然后将其添加到会话中并提交。
from sqlalchemy.orm import sessionmaker# 创建会话
Session = sessionmaker(bind=engine)
session = Session()# 添加数据
new_user = User(name='Alice', age=25)
session.add(new_user)
session.commit()
3.5 查询数据:
使用会话查询模型对象。
# 查询数据
user = session.query(User).filter_by(name='Alice').first()
if user:print("User found:", user.name, user.age)
else:print("User not found")
3.6 更新数据:
可以更新模型对象的属性,然后提交会话来更新数据库。
user.age = 26
session.commit()
3.7 删除数据:
使用delete()方法删除模型对象,然后提交会话。
session.delete(user)
session.commit()
3.8 关闭会话:
记得在完成操作后关闭会话。
session.close()
4 实战
设计一个简单的图书管理系统。
以下是一个使用SQLAlchemy的图书管理系统的完整示例:
确保已安装sqlalchemy, pip install sqlalchemy
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base# 创建数据库连接
engine = create_engine('sqlite:///library.db')
Base = declarative_base()# 定义作者模型类
class Author(Base):__tablename__ = 'authors'id = Column(Integer, primary_key=True)name = Column(String)# 定义图书模型类
class Book(Base):__tablename__ = 'books'id = Column(Integer, primary_key=True)title = Column(String)author_id = Column(Integer, ForeignKey('authors.id'))# 创建数据表
Base.metadata.create_all(engine)# 创建会话
Session = sessionmaker(bind=engine)
session = Session()# 添加作者
author1 = Author(name='J.K. Rowling')
author2 = Author(name='George Orwell')session.add_all([author1, author2])
session.commit()# 添加图书
book1 = Book(title='Harry Potter and the Sorcerer\'s Stone', author_id=author1.id)
book2 = Book(title='1984', author_id=author2.id)session.add_all([book1, book2])
session.commit()# 查询数据
print("Authors:")
authors = session.query(Author).all()
for author in authors:print("Author:", author.name)selected_author = session.query(Author).filter_by(name='J.K. Rowling').first()
if selected_author:print("\nBooks by", selected_author.name)books = session.query(Book).filter_by(author_id=selected_author.id).all()for book in books:print("Book:", book.title)# 关闭会话
session.close()
上述代码示例演示了如何使用SQLAlchemy库创建一个简单的图书管理系统。
导入所需模块:代码开始时导入了所需的SQLAlchemy模块,包括创建引擎、定义模型类、创建数据表和会话等。
创建数据库连接和基类:使用
create_engine函数创建了SQLite数据库连接,然后通过declarative_base创建了一个基类Base。定义模型类:定义了两个模型类,即
Author(作者)和Book(图书)。每个类对应一个表,类的属性对应表的列。创建数据表:通过调用
Base.metadata.create_all(engine)方法,基于模型类创建了数据库中的数据表。创建会话:使用
sessionmaker创建了一个会话类Session,然后通过Session()创建了一个会话实例session。添加数据:创建了两个作者实例,使用
session.add_all()将其添加到会话中,并通过session.commit()提交到数据库。查询数据:使用
session.query()查询了作者和图书信息,并进行了打印输出。关闭会话:在所有操作完成后,通过
session.close()关闭了会话,释放资源。总体而言,这个示例展示了如何使用SQLAlchemy来创建数据库模型、执行数据库操作、查询数据以及关闭会话。通过使用ORM,你可以将数据库操作转化为面向对象的方式,使代码更加清晰、可维护。你可以根据需求进一步扩展这个示例,添加更多功能和复杂性。
相关文章:
【100天精通python】Day34:使用python操作数据库_ORM(SQLAlchemy)使用
目录 专栏导读 1 ORM 概述 2 SQLAlchemy 概述 3 ORM:SQLAlchemy使用 3.1 安装SQLAlchemy: 3.2 定义数据库模型类: 3.3 创建数据表: 3.4 插入数据: 3.5 查询数据: 3.6 更新数据: 3.7 删…...
CCLINK IE转MODBUS-TCP网关modbus tcp协议详解
你是否曾经遇到过需要同时处理CCLINK IE FIELD BASIC和MODBUS两种数据协议的情况?捷米的JM-CCLKIE-TCP网关可以帮助你解决这个问题。 捷米JM-CCLKIE-TCP网关可以分别从CCLINK IE FIELD BASIC一侧和MODBUS一侧读写数据,然后将数据存入各自的缓冲区。接着…...
vue2根据不同的电脑分辨率显示页面内容及不同设备适配显示
1.安装插件: npm install postcss-px2rem px2rem-loader --save npm i lib-flexible --save 2.创建flexible.js,并在main.js引用 ;(function(win, lib) {var doc = win.document;var docEl = doc.documentElement;var metaEl = doc.querySelector(meta[name="viewport&…...
概率论:多维随机变量及分布
多维随机变量及分布 X X X为随机变量, ∀ x ∈ R , P { X ≤ x } F ( x ) \forall x\in R,P\{X\le x\}F(x) ∀x∈R,P{X≤x}F(x) 设 F ( x ) F(x) F(x)为 X X X的分布函数,则 (1) 0 ≤ F ( x ) ≤ 1 0\le F(x)\le1 0≤F(x)≤1 &am…...
flutter-第三方组件
卡片折叠 stacked_card_carousel 扫一扫组件 qr_code_scanner 权限处理组件 permission_handler 生成二维码组件 pretty_qr_code 角标组件 badges 动画组件 animations app更新 app_installer 带缓存的图片组件 cached_network_image 密码输入框 collection 图片保存 image_g…...
迪瑞克斯拉算法
迪锐克斯拉算法 简单来说就是在有向图中,给定一个图中具体的出发点,从这个点出发能够到达的所有的点,每个点的最短距离是多少。到不了的点,距离则是正无穷。有向,无负权重,可以有环。 所以说,迪…...
数据结构:力扣OJ题(每日一练)
目录 题一:环形链表 思路一: 题二:复制带随机指针的链表 思路一: 本人实力有限可能对一些地方解释的不够清晰,可以自己尝试读代码,望海涵! 题一:环形链表 给定一个链表的头节点…...
【论文阅读】基于深度学习的时序预测——Informer
系列文章链接 论文一:2020 Informer:长时序数据预测 论文二:2021 Autoformer:长序列数据预测 论文三:2022 FEDformer:长序列数据预测 论文四:2022 Non-Stationary Transformers:非平…...
机器学习 | Python实现GBDT梯度提升树模型设计
机器学习 | Python实现GBDT梯度提升树模型设计 目录 机器学习 | Python实现GBDT梯度提升树模型设计基本介绍模型描述模型使用参考资料基本介绍 机器学习 | Python实现GBDT梯度提升树模型设计。梯度提升树(Grandient Boosting)是提升树(Boosting Tree)的一种改进算法,GBDT也…...
elementUi表单恢复至初始状态并不触发表单验证
elementUi表单恢复至初始状态并不触发表单验证 1.场景再现2.解决方法 1.场景再现 左侧是树形列表,右侧是显示节点的详情,点击按钮应该就是新增一个规则的意思,表单内容是没有改变的,所以就把需要把表单恢复至初始状态并不触发表单…...
大模型相关知识
一. embedding 简单来说,embedding就是用一个低维的向量表示一个物体,可以是一个词,或是一个商品,或是一个电影等等。这个embedding向量的性质是能使距离相近的向量对应的物体有相近的含义,比如 Embedding(复仇者联盟)…...
无法在 macOS Ventura 上启动 Multipass
异常信息 ➜ ~ sudo multipass authenticate Please enter passphrase: authenticate failed: Passphrase is not set. Please multipass set local.passphrase with a trusted client. ➜ ~ multipass set local.passphrase Please enter passphrase: Please re-enter…...
算法通关村第六关——原来如此简单
层次遍历:又叫广度优先遍历。就是从根节点开始,先访问根节点下面一层全部元素,再访问之后的层次,直到访问完二叉树的最后一层。 我们先看一下基础的层次遍历题,力扣102题:给你一个二叉树,请你返…...
企业权限管理(八)-登陆使用数据库认证
Spring Security 使用数据库认证 在 Spring Security 中如果想要使用数据进行认证操作,有很多种操作方式,这里我们介绍使用 UserDetails 、 UserDetailsService来完成操作。 UserDetails public interface UserDetails extends Serializable { Collecti…...
第一百二十五天学习记录:C++提高:STL-deque容器(下)(黑马教学视频)
deque插入和删除 功能描述: 向deque容器中插入和删除数据 函数原型: 两端插入操作: push_back(elem); //在容器尾部添加一个数据 push_front(elem); //在容器头部插入一个数据 pop_back(); //删除容器最后一个数据 pop_front(); //删除容器…...
案例12 Spring MVC入门案例
网页输入http://localhost:8080/hello,浏览器展示“Hello Spring MVC”。 1. 创建项目 选择Maven快速构建web项目,项目名称为case12-springmvc01。 2.配置Maven依赖 <?xml version"1.0" encoding"UTF-8"?><project xm…...
【React】精选10题
1.React Hooks带来了什么便利? React Hooks是React16.8版本中引入的新特性,它带来了许多便利。 更简单的状态管理 使用useState Hook可以在函数组件中方便地管理状态,避免了使用类组件时需要继承React.Component的繁琐操作。 避免使用类组件…...
VS Spy++进程信息获取
查看进程中窗口信息。 Spy使用介绍 Windows下的程序及热键监视神器——Spy Word进程获取...
Java课题笔记~ SpringMVC概述
1.1 SpringMVC简介 SpringMVC 也叫Spring web mvc。是Spring 框架的一部分,在Spring3.0 后发布的。 1.2 SpringMVC的优点 基于MVC 架构 基于 MVC 架构,功能分工明确。解耦合。 容易理解,上手快,使用简单 就可以开发一个注解…...
SOPC之NIOS Ⅱ遇到的问题
记录NIOS Ⅱ中遇到的报错 一、NIOS II中Eclipse头文件未找到 问题:Unresolved inclusion: "system.h"等 原因:编译器无法找到头文件所在路径 解决方法: 在文件夹中找到要添加的头文件,并记录下其路径,如…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 指定配置项 ->渲染数据 准备一个容器,例如: …...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
