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

Python实战:SQLAlchemy ORM使用教程

一、SQLAlchemy ORM使用教程

SQLAlchemy是一个流行的Python SQL工具包和对象关系映射(ORM)框架,它为开发人员提供了一种高效、灵活的方式来与数据库进行交互。在本篇博客中,我们将深入探讨SQLAlchemy ORM的核心知识,并通过具体的代码示例来帮助您快速上手。

二、SQLAlchemy简介

SQLAlchemy由Mike Bayer创建,它提供了两种主要的组件:SQLAlchemy Core和SQLAlchemy ORM。

  • SQLAlchemy Core:是一个SQL表达式语言和数据库抽象层,它允许您使用Python类来表示数据库表,并且可以使用Python表达式来编写SQL查询。
  • SQLAlchemy ORM:是一个建立在SQLAlchemy Core之上的对象关系映射器,它允许您使用Python类来表示数据库表,并且可以通过操作这些类实例来执行数据库操作。
    在本篇博客中,我们将重点介绍SQLAlchemy ORM的使用。

三、安装SQLAlchemy

在开始使用SQLAlchemy之前,需要确保已经安装了Python。SQLAlchemy可以通过pip命令进行安装:

pip install SQLAlchemy

四、连接到数据库

要使用SQLAlchemy ORM,首先需要创建一个数据库连接。SQLAlchemy支持多种数据库后端,包括SQLite、MySQL、PostgreSQL等。
以下是一个使用SQLite数据库的示例:

from sqlalchemy import create_engine
engine = create_engine('sqlite:///example.db')

在这个示例中,我们使用create_engine()函数创建了一个SQLite数据库引擎,它将连接到名为example.db的SQLite数据库文件。

五、定义模型

在SQLAlchemy ORM中,模型通常是通过定义Python类来实现的,这些类继承自sqlalchemy.ext.declarative.api.DeclarativeMeta。每个类对应于数据库中的一个表,类的属性对应于表中的列。
以下是一个简单的用户模型示例:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)

在这个示例中,我们首先创建了一个Base类,它将作为所有模型类的基类。然后,我们定义了一个User类,它继承自Base类。__tablename__属性指定了数据库中对应的表名。idnameage属性定义了表中的列,Column函数用于指定列的数据类型和约束。

六、创建表

在定义了模型之后,我们可以使用Base.metadata.create_all()方法来创建数据库表。

from sqlalchemy.orm import sessionmaker
# 创建数据库连接
engine = create_engine('sqlite:///example.db')
# 创建所有表
Base.metadata.create_all(engine)

在这个示例中,我们首先创建了一个数据库连接。然后,我们调用了Base.metadata.create_all()方法,它将根据模型定义创建所有表。

七、创建会话

在SQLAlchemy ORM中,会话(Session)是用于与数据库进行交互的主要接口。会话允许您执行数据库操作,如插入、查询、更新和删除数据。
以下是一个创建会话的示例:

from sqlalchemy.orm import sessionmaker
# 创建数据库连接
engine = create_engine('sqlite:///example.db')
# 创建会话工厂
Session = sessionmaker(bind=engine)
# 创建会话实例
session = Session()

在这个示例中,我们首先创建了一个数据库连接。然后,我们使用sessionmaker函数创建了一个会话工厂。最后,我们创建了一个会话实例,它将用于执行数据库操作。

八、插入数据

在SQLAlchemy ORM中,要插入数据,首先需要创建模型类的实例,并将其添加到会话中。然后,可以使用会话的commit()方法将更改提交到数据库。
以下是一个插入数据的示例:

# 创建用户实例
user = User(name='Alice', age=30)
# 添加用户到会话
session.add(user)
# 提交事务
session.commit()

在这个示例中,我们首先创建了一个User实例,并设置了nameage属性。然后,我们使用add()方法将用户实例添加到会话中。最后,我们调用了commit()方法将更改提交到数据库。

九、查询数据

在SQLAlchemy ORM中,要查询数据,可以使用会话的query()方法。query()方法接受模型类作为参数,并返回一个查询对象。查询对象提供了多种方法来执行不同的查询操作。
以下是一些查询数据的示例:

# 查询所有用户
users = session.query(User).all()
# 查询特定条件的用户
user = session.query(User).filter_by(name='Alice').first()
# 查询并排序
users = session.query(User).order_by(User.age.desc
()).all()
# 查询并限制返回数量
users = session.query(User).limit(5).all()
# 查询并偏移
users = session.query(User).offset(5).limit(5).all()
# 查询并使用原生SQL
users = session.query(User).filter("age > 25").all()

在这个示例中,我们展示了如何执行不同的查询操作。all()方法返回查询结果的所有记录,first()方法返回查询结果的第一条记录。filter_by()方法用于根据特定条件过滤记录,order_by()方法用于排序记录,limit()方法用于限制返回的记录数量,offset()方法用于偏移查询结果的起始点。此外,还可以使用filter()方法配合原生SQL语句进行查询。

十、更新数据

在SQLAlchemy ORM中,要更新数据,可以使用会话的query()方法获取要更新的记录,然后修改记录的属性,并提交会话。
以下是一个更新数据的示例:

# 查询要更新的用户
user = session.query(User).filter_by(name='Alice').first()
# 更新用户属性
user.age = 31
# 提交事务
session.commit()

在这个示例中,我们首先查询了名为Alice的用户。然后,我们修改了用户的age属性。最后,我们提交了会话以保存更改。

十一、删除数据

在SQLAlchemy ORM中,要删除数据,可以使用会话的query()方法获取要删除的记录,然后使用delete()方法删除记录,并提交会话。
以下是一个删除数据的示例:

# 查询要删除的用户
user = session.query(User).filter_by(name='Alice').first()
# 删除用户
session.delete(user)
# 提交事务
session.commit()

在这个示例中,我们首先查询了名为Alice的用户。然后,我们使用delete()方法删除了该用户。最后,我们提交了会话以保存更改。

十二、使用事务

在SQLAlchemy ORM中,可以使用会话来管理事务。会话提供了一个begin()方法来开始一个事务,以及一个commit()方法来提交事务。如果发生错误,可以使用rollback()方法来回滚事务。
以下是一个使用事务的示例:

# 开始事务
session.begin()
try:# 执行数据库操作user = User(name='Bob', age=25)session.add(user)session.commit()
except:# 回滚事务session.rollback()raise

在这个示例中,我们首先调用了begin()方法开始一个事务。然后,我们尝试执行数据库操作,如果操作成功,我们提交事务。如果发生错误,我们回滚事务并重新抛出异常。

十三、关闭会话

在完成数据库操作后,应该关闭会话以释放资源。

# 关闭会话
session.close()

十四、结论

SQLAlchemy ORM是一个功能强大且灵活的工具,它允许我们使用Python类和实例来表示数据库表和记录。在本篇博客中,我们介绍了如何连接到数据库、定义模型、创建表、插入、查询、更新和删除数据、使用事务以及关闭会话。这些知识将帮助我们在Python应用程序中高效地使用SQLAlchemy ORM。

相关文章:

Python实战:SQLAlchemy ORM使用教程

一、SQLAlchemy ORM使用教程 SQLAlchemy是一个流行的Python SQL工具包和对象关系映射(ORM)框架,它为开发人员提供了一种高效、灵活的方式来与数据库进行交互。在本篇博客中,我们将深入探讨SQLAlchemy ORM的核心知识,并…...

能不能绕过c去学c++?

目前做工程开发,基本都是c/c混着用的,c/c是同源的,c/是在c的基础上发展起来的,它们之间有些联系和区别: 区别: 1.可用库不同 c基本是系统底层语言,一般系统底层开发用c(例如&…...

Python 小爬虫:爬取 bing 每日壁纸设为桌面壁纸

请求 URLJSON 版示例代码代码片段注意点headers 中的 User-Agent响应头中的 Content-Type终端通过代理API从 bing.com 找Bing 每日壁纸设置为桌面壁纸代码设定计划任务自动执行 python 脚本请求 URL 通过模仿必应(Bing)自己的 AJAX 调用方式获得请求 URL。 JSON 格式:...

利用textarea和white-space实现最简单的文章编辑器 支持缩进和换行

当你遇到一个非常基础的文章发布和展示的需求,只需要保留换行和空格缩进,你是否会犹豫要使用富文本编辑器?实际上这个用原生的标签两步就能搞定! 1.直接用textarea当编辑器 textarea本身就可以保存空格和换行符,示例如…...

总结mac下解决matplotlib中文显示问题的几种方法

一、前言: 使⽤matplotlib画图时,由于matplotlib默认没有中⽂,显⽰中文时会出现空⽩⼩⽅块。 二、方法: 2.1 matplotlib中使用SimHei字体 1)进入终端后查看matplotlib的字体路径: $ python >>&g…...

探索区块链世界:从加密货币到去中心化应用

相信提到区块链,很多人会想到比特币这样的加密货币,但实际上,区块链技术远不止于此,它正在深刻地改变我们的生活和商业。 首先,让我们来简单了解一下什么是区块链。区块链是一种分布式数据库技术,它通过将…...

GitLab/Github从头开始配置秘钥

1、下载git安装包 CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?pathgit-for-windows/ 拉到页面最底部选择 点进文件夹下载32位或者64位的版本,我的是64位就选择64的版本进行安装 2、傻瓜式安装 3、在相应的文件夹右键选择 UserName为你的用…...

uni.getlocation h5获取定位失败后,阻塞问题

uni.getlocation 在H5中,如果用户未开gps定位或者gps定位信号较差时,定位会失败。这种情况uni.getlocation也不会出现报错,也不会有后续执行,导致代码阻塞,体验极差。 解决方案1:拿不到定位或者定位失败这个…...

Flutter 运行 flutter doctor 命令长时间未响应

由于 Flutter 运行 flutter doctor 命令,会从 pub(https://pub.dev/ 类似于 Node.js 的 npm) 上进行资源的下载,如果没有配置国内镜像,可能会由于其服务器在国外导致资源下载慢或者下载不下来,所以出现了运行 flutter doctor 命令…...

【数据挖掘】练习2:数据管理2

课后作业2&#xff1a;数据管理2 一&#xff1a;上机实验2 # 编写函数stat&#xff0c;要求该函数同时计算均值&#xff0c;最大值&#xff0c;最小值&#xff0c;标准差&#xff0c;峰度和偏度。 install.packages("timeDate") library(timeDate) stat <- func…...

【iOS】——Blocks

文章目录 前言一、Blocks概要1.什么是Blocks 二、Block模式1.block语法2.block类型变量3.截获自动变量值4._Block修饰符5.截获的自动变量 三、Blocks的实现1.Block的实质2.截获自动变量值3._Block说明符4.Block存储域 前言 一、Blocks概要 1.什么是Blocks Blocks是C语言的扩…...

体验OceanBase OBD V2.5.0 组件内扩容和组件变更

背景 OBD 是OceanBase的命令行部署工具&#xff0c;在 obd V2.5.0 版本之前&#xff0c;其主要功能主要是部署各类组件&#xff0c;例如 oceanbase-ce,obproxy-ce,obagent 等。然而&#xff0c;它并不支持组件的变更操作以及组件内部的扩缩容调整。具体来说&#xff1a; 1、若…...

关于前端的学习

目录 前言: 1.初识HTML: 1.1超文本: 1.2标记语言: 2.关于html的基本框架: 3.HTML基本文字标签: 3.1.h标题标签: 3.3 文本内容: 3.4换行的和分割的: 3.5 特殊文字标签: 3.5.1表面上看着三对的结果呈现都是一样的: 3.5.2但是其背后的效果其实是不一样的: 3.6转义字符:…...

DataX脚本告别手动编写,用大模型或Java代码自动生成

在离线数仓开发中,DataX支持多种数据源,性能好抽取速度快。美中不足的是,对需要抽取的每一张表都需要写配置文件,这样很繁琐和耗时。可以用大模型提示词来节省这方面的工作量。ChatGPT等大模型并不能很智能提供一个完全正确的,需要提供一个模板让它参考。 方法1:用大模型…...

ASP.NET通过Appliaction和Session统计在人数和历史访问量

目录 背景: Appliaction&#xff1a; Session&#xff1a; 过程&#xff1a; 数据库&#xff1a; Application_Start&#xff1a; Session_Start&#xff1a; Session_End&#xff1a; Application_End&#xff1a; 背景: 事件何时激发Application_Start在调用当前应用…...

在基于全志V851se的TinyVision上手动构建 Linux 6.1 + Debian 12 镜像

构建 SyterKit 作为 Bootloader SyterKit 是一个纯裸机框架&#xff0c;用于 TinyVision 或者其他 v851se/v851s/v851s3/v853 等芯片的开发板&#xff0c;SyterKit 使用 CMake 作为构建系统构建&#xff0c;支持多种应用与多种外设驱动。同时 SyterKit 也具有启动引导的功能&a…...

使用jenkins-pipeline进行利用项目文件自动化部署到k8s上

Discard old builds:丢弃旧的构建,目的是管理存储空间、提升性能以及保持环境整洁 Do not allow concurrent builds: 禁止并发构建是指同一时间内只允许一个构建任务执行,避免多个构建同时运行可能带来的问题 Do not allow the pipeline to resume if the controller resta…...

unity发布安卓获取读取权限

一、Player Settings 设置 Player Settings>Player>Other Settings> Android > Write Permission > External (SDCard). 二、代码 using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Andr…...

VSCode下使用github初步

由于各种需要&#xff0c;现在需要统一将一些代码提交搞github&#xff0c;于是有了在VSCode下使用github的需求。之前只是简单的使用git clone&#xff0c;代码提交这些用的是其他源代码工具&#xff0c;于是得学习实操下&#xff0c;并做一记录以备后用。 安装 VSCode安装 …...

华为设备配置命令大全

目录 一、华为设备常用命令视图 二、返回命令和保存命令 三、设置设备名称 四、关闭泛洪信息 五、设置设备接口的IP地址和子网掩码 六、交换机的登录 6.1、设置Consile接口密码 6.2、设置Telent接口密码 七、VLAN配置 7.1、创建VLAN 7.2、进入vlan视图 7.3、把端口…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...