Perl 语言开发(十四):数据库操作
目录
1. 数据库连接
2. 基本数据库操作
2.1 插入数据
2.2 查询数据
2.3 更新数据
2.4 删除数据
3. 高级查询
3.1 多表连接
3.2 子查询
3.3 聚合查询
4. 事务处理
5. 数据库连接池
6. 常见的数据库模块
7. 综合实例
结论
数据库操作是大多数软件系统的核心部分。掌握如何使用 Perl 进行数据库操作是每个 Perl 开发者必须具备的重要技能。本文将深入探讨 Perl 与数据库交互的各个方面,包括数据库连接、基本操作(增删改查)、高级查询、事务处理、数据库连接池和常见的数据库模块等。通过详细的讲解和实例代码演示,帮助读者全面理解和掌握 Perl 的数据库操作。
1. 数据库连接
要使用 Perl 进行数据库操作,首先需要与数据库建立连接。Perl 提供了多个模块来实现这一功能,最常用的是 DBI(Database Independent Interface)模块。
use strict;
use warnings;
use DBI;# 数据库连接参数
my $dsn = "DBI:mysql:database=testdb;host=localhost";
my $username = "root";
my $password = "password";# 建立数据库连接
my $dbh = DBI->connect($dsn, $username, $password, { RaiseError => 1, AutoCommit => 1 })or die $DBI::errstr;print "Connected to the database successfully!\n";
在上面的示例代码中,我们使用 DBI->connect
方法与 MySQL 数据库建立连接。$dsn
包含数据库类型、数据库名称和主机名,$username
和 $password
分别是数据库的用户名和密码。{ RaiseError => 1, AutoCommit => 1 }
是连接属性,指定遇到错误时自动抛出异常,并且自动提交事务。
2. 基本数据库操作
2.1 插入数据
插入数据是数据库操作中最基本的操作之一。下面是一个使用 Perl 插入数据的示例:
# 插入数据
my $sql = "INSERT INTO users (name, age) VALUES (?, ?)";
my $sth = $dbh->prepare($sql);
$sth->execute("Alice", 30)or die $DBI::errstr;print "Record inserted successfully!\n";
在这个示例中,我们使用 prepare
方法准备 SQL 语句,然后使用 execute
方法执行该语句。?
是占位符,execute
方法的参数会依次替换占位符。
2.2 查询数据
查询数据是获取数据库信息的主要方式。下面是一个查询数据的示例:
# 查询数据
my $sql = "SELECT id, name, age FROM users WHERE age > ?";
my $sth = $dbh->prepare($sql);
$sth->execute(25)or die $DBI::errstr;while (my @row = $sth->fetchrow_array) {print "ID: $row[0], Name: $row[1], Age: $row[2]\n";
}
在这个示例中,我们准备并执行了一个带有条件的查询语句。使用 fetchrow_array
方法获取每一行的结果,并打印出来。
2.3 更新数据
更新数据是对已有记录进行修改的操作。下面是一个更新数据的示例:
# 更新数据
my $sql = "UPDATE users SET age = ? WHERE name = ?";
my $sth = $dbh->prepare($sql);
$sth->execute(35, "Alice")or die $DBI::errstr;print "Record updated successfully!\n";
在这个示例中,我们更新了 name
为 Alice
的用户的 age
。
2.4 删除数据
删除数据是从数据库中移除记录的操作。下面是一个删除数据的示例:
# 删除数据
my $sql = "DELETE FROM users WHERE name = ?";
my $sth = $dbh->prepare($sql);
$sth->execute("Alice")or die $DBI::errstr;print "Record deleted successfully!\n";
在这个示例中,我们删除了 name
为 Alice
的用户。
3. 高级查询
高级查询通常涉及多个表的连接、子查询、聚合函数等。下面是一些高级查询的示例:
3.1 多表连接
多表连接是数据库查询中常用的操作之一。下面是一个多表连接的示例:
# 多表连接查询
my $sql = "SELECT users.id, users.name, orders.order_id, orders.amountFROM usersJOIN orders ON users.id = orders.user_idWHERE orders.amount > ?";
my $sth = $dbh->prepare($sql);
$sth->execute(100)or die $DBI::errstr;while (my @row = $sth->fetchrow_array) {print "UserID: $row[0], UserName: $row[1], OrderID: $row[2], Amount: $row[3]\n";
}
在这个示例中,我们连接了 users
表和 orders
表,查询订单金额大于 100 的记录。
3.2 子查询
子查询是查询中的查询,通常用于复杂的查询需求。下面是一个子查询的示例:
# 子查询
my $sql = "SELECT name, ageFROM usersWHERE age > (SELECT AVG(age) FROM users)";
my $sth = $dbh->prepare($sql);
$sth->execute()or die $DBI::errstr;while (my @row = $sth->fetchrow_array) {print "Name: $row[0], Age: $row[1]\n";
}
在这个示例中,我们查询了年龄大于用户平均年龄的用户。
3.3 聚合查询
聚合查询通常用于计算统计信息,如总数、平均值、最大值等。下面是一个聚合查询的示例:
# 聚合查询
my $sql = "SELECT AVG(age) AS average_age FROM users";
my $sth = $dbh->prepare($sql);
$sth->execute()or die $DBI::errstr;my @row = $sth->fetchrow_array;
print "Average Age: $row[0]\n";
在这个示例中,我们计算并输出了用户的平均年龄。
4. 事务处理
事务处理用于保证一组数据库操作的原子性、一致性、隔离性和持久性(ACID)。下面是一个事务处理的示例:
# 开始事务
$dbh->begin_workor die $DBI::errstr;# 执行多个操作
eval {my $sql1 = "UPDATE accounts SET balance = balance - 100 WHERE id = 1";my $sth1 = $dbh->prepare($sql1);$sth1->execute()or die $DBI::errstr;my $sql2 = "UPDATE accounts SET balance = balance + 100 WHERE id = 2";my $sth2 = $dbh->prepare($sql2);$sth2->execute()or die $DBI::errstr;# 提交事务$dbh->commit;
};
if ($@) {# 回滚事务$dbh->rollback;die "Transaction failed: $@";
}print "Transaction completed successfully!\n";
在这个示例中,我们更新了两个账户的余额,并确保两个操作要么都成功,要么都失败。
5. 数据库连接池
数据库连接池用于管理数据库连接的复用,提高系统的性能和资源利用率。Perl 提供了一些模块来实现数据库连接池,如 DBIx::Connector。
use strict;
use warnings;
use DBIx::Connector;# 创建数据库连接池
my $dsn = "DBI:mysql:database=testdb;host=localhost";
my $username = "root";
my $password = "password";my $conn = DBIx::Connector->new($dsn, $username, $password, {RaiseError => 1,AutoCommit => 1,
});# 使用连接池执行查询
$conn->run(fixup => sub {my $dbh = $_;my $sth = $dbh->prepare("SELECT name, age FROM users");$sth->execute();while (my @row = $sth->fetchrow_array) {print "Name: $row[0], Age: $row[1]\n";}
});
在这个示例中,我们使用 DBIx::Connector 模块创建了一个数据库连接池,并通过连接池执行了一个查询操作。
6. 常见的数据库模块
Perl 提供了多个数据库模块,支持各种数据库的操作。以下是一些常见的数据库模块:
- DBI:Perl 数据库接口模块,提供了统一的数据库操作接口。
- DBD::mysql:MySQL 数据库驱动程序,支持 MySQL 数据库的操作。
- DBD::Pg:PostgreSQL 数据库驱动程序,支持 PostgreSQL 数据库的操作。
- DBIx::Class:Perl 的 ORM 模块,提供了对象关系映射功能。
- DBIx::Connector:数据库连接池管理模块,提高了数据库连接的复用性。
7. 综合实例
为了更好地理解 Perl 的数据库操作,我们来看一个综合实例。这个实例演示了如何使用 Perl 创建一个简单的用户管理系统,包括用户的增删改查操作。
use strict;
use warnings;
use DBI;# 数据库连接参数
my $dsn = "DBI:mysql:database=testdb;host=localhost";
my $username = "root";
my $password = "password";# 建立数据库连接
my $dbh = DBI->connect($dsn, $username, $password, { RaiseError => 1, AutoCommit => 1 })or die $DBI::errstr;# 创建 users 表
my $sql = "CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,age INT NOT NULL
)";
$dbh->do($sql) or die $DBI::errstr;# 插入数据
$sql = "INSERT INTO users (name, age) VALUES (?, ?)";
my $sth = $dbh->prepare($sql);
$sth->execute("Alice", 30) or die $DBI::errstr;
$sth->execute("Bob", 25) or die $DBI::errstr;# 查询数据
$sql = "SELECT id, name, age FROM users";
$sth = $dbh->prepare($sql);
$sth->execute() or die $DBI::errstr;while (my @row = $sth->fetchrow_array) {print "ID: $row[0], Name: $row[1], Age: $row[2]\n";
}# 更新数据
$sql = "UPDATE users SET age = ? WHERE name = ?";
$sth = $dbh->prepare($sql);
$sth->execute(35, "Alice") or die $DBI::errstr;# 删除数据
$sql = "DELETE FROM users WHERE name = ?";
$sth = $dbh->prepare($sql);
$sth->execute("Bob") or die $DBI::errstr;print "Database operations completed successfully!\n";# 断开数据库连接
$dbh->disconnect;
在这个综合实例中,我们首先创建了一个 users
表,然后进行了插入、查询、更新和删除操作,最后断开了数据库连接。
结论
通过本文的讲解和实例代码演示,我们详细探讨了 Perl 与数据库交互的各个方面,包括数据库连接、基本操作、高级查询、事务处理、数据库连接池和常见的数据库模块等。希望本文能够帮助读者全面理解和掌握 Perl 的数据库操作,从而在实际开发中构建出高效、稳定和可扩展的软件系统。
相关文章:
Perl 语言开发(十四):数据库操作
目录 1. 数据库连接 2. 基本数据库操作 2.1 插入数据 2.2 查询数据 2.3 更新数据 2.4 删除数据 3. 高级查询 3.1 多表连接 3.2 子查询 3.3 聚合查询 4. 事务处理 5. 数据库连接池 6. 常见的数据库模块 7. 综合实例 结论 数据库操作是大多数软件系统的核心部分。…...

Qt+ESP32+SQLite 智能大棚
环境简介 硬件环境 ESP32、光照传感器、温湿度传感器、继电器、蜂鸣器 基本工作流程 上位机先运行,下位机启动后尝试连接上位机连接成功后定时上报传感器数据到上位机,上位机将信息进行处理展示判断下位机传感器数据,如果超过设置的阈值&a…...

Android Viewpager2 remove fragmen不生效解决方案
一、介绍 在如今的开发过程只,内容变化已多单一的fragment,变成连续的,特别是以短视频或者直播为主的场景很多。从早起的Viewpage只能横向滑动,到如今的viewpage2可以支持横向或者竖向滑动。由于viewpage2的adapter在设计时支持缓…...

桃园南路上的红绿灯c++
题目描述 XXX非常讨厌等红绿灯,于是他仔细观察了桃园南路与科技路交叉口的一个红绿灯的周期。 从七点半开始,这个红绿灯的每个周期会按照下面四个阶段变化: 先保持 x 分钟的红灯然后保持 y 分钟的黄灯然后保持 z 分钟的绿灯最后保持 y 分钟…...
有关去中心化算路大模型的一些误区:低带宽互连导致训练速度太慢;小容量设备无法生成基础规模的模型;去中心化总是会花费更多;虫群永远不够大
目录 有关去中心化算路大模型的一些误区 低带宽互连导致训练速度太慢 挑战与解决方案 展望 小容量设备无法生成基础规模的模型 1. 模型规模与设备内存 2. 解决方案 3. 效率挑战 FSDP(Fully Sharded Data Parallel) Zero-3 去中心化总是会花费更多 虫群永远不够大…...

uni-app iOS上架相关App store App store connect 云打包有次数限制
app store上架成功,亲测在苹果开发者通过审核后在数小时内app store是不会更新的,昨天4点多通过审核,在下班六点半时app store仍未更新,早上来看更新了。 相册权限 uni-app云打包免费有次数 切换一个账号继续...

python单测框架之pytest常见用法
单测框架的作用 测试发现:从多个文件中寻找测试用例。测试执行:按照一定顺序去执行并且生成结果。测试断言:判断最终结果与实际结果的差异。测试报告:统计测试进度、耗时、通过率,生成测试报告。 pytest简介 pytest是…...
[终端安全]-8 隐私保护和隐私计算技术
1 隐私保护相关法规和标准 1)国内法规和标准 1.1)中华人民共和国网络安全法(2017年) - 规定了个人信息的保护和数据安全的基本原则。 - 要求网络运营者采取措施防止数据泄露、篡改和丢失。 1.2)信息安全技术&#x…...
MySQL 日志深度解析:从查询执行到性能优化
引言 MySQL 日志是数据库管理员和开发者的宝贵资源,它提供了查询执行的详细情况,帮助我们诊断问题和优化性能。本文将深入分析一个具体的 MySQL 日志条目,解释其含义,并提供针对性的优化建议。 日志信息概览 让我们先来快速了解…...

sql server 练习题5
课后作业 在homework库下执行 作业1: 案例:根据用户分数划分等级。小于60分为不及格,[60,80)为及格,[80,90)为良好,大于等于90分以上为优秀。 建表语句: CREATE TABLE Grades ( ID INT PRIMARY KEY, Name V…...

ai伪原创生成器app,一键伪原创文章效率高
如今,在自媒体创作的领域,ai伪原创生成器app的出现,给写作带来了一种全新的方式和效率。ai伪原创生成器app通过使用先进的自然语言处理技术和深度学习算法,能够将原始文章进行重组和改写,生成新的文章,从而…...
【ZhangQian AI模型部署】目标检测、SAM、3D目标检测、旋转目标检测、人脸检测、检测分割、关键点、分割、深度估计、车牌识别、车道线识别
在模型部署落地(主要部署到rk3588)折腾了这么多年,把这些年折腾过的模型整理了一下,所有的流程说明、代码模型都完全开放的,欢迎交流学习。有的是为了项目、有的是为了学习、还有的是为了找点事做、有的完全是为了安抚…...

DROO论文笔记
推荐文章DROO源码及论文学习 读论文《Deep Reinforcement Learning for Online Computation Offloading in Wireless Powered Mobile-Edge Computing Networks》的笔记 论文地址:用于无线移动边缘计算网络在线计算卸载的深度强化学习 论文代码地址:DR…...

修BUG:程序包javax.servlet.http不存在
貌似昨晚上并没有成功在tomcat上面运行,而是直接运行了网页。 不知道为啥又报错这个。。。 解决方案: https://developer.baidu.com/article/details/2768022 就整了这一步就行了 而且我本地就有这个tomcat就是加进去了。 所以说啊,是不是&a…...

python常用库
目录 from sklearn import metrics:评估 编辑 svm: 编辑 逻辑回归预测 编辑 朴素贝叶斯分类 编辑 主成分分析 编辑 其实就是求b.T的协方差阵 编辑 【因子分析,因子旋转有点复杂,略】 【层次聚类,原理…...

【UE5.3】笔记11
一、变量的SET&&GET 1、创建变量保存数据,如下图,找到左侧我的蓝图下的变量,新增一个,并选择类型。使用的时候直接将变量拖到蓝图中,此时会显示两个选项一个是获取一个是设置。 选择获取就是个GET蓝图&#x…...
加密与安全 密钥体系的三个核心目标之完整性解决方案
在密钥体系中,确保数据完整性是重要目标之一。以下为您详细讲解相关的完整性解决方案: 消息认证码(MAC): 消息认证码是基于共享密钥和特定算法生成的固定长度代码。在发送方,将消息和共享密钥作为输入&…...

FastAPI 学习之路(四十一)定制返回Response
接口中返回xml格式内容 from fastapi import FastAPI, Responseapp FastAPI()# ① xml app.get("/legacy") def get_legacy_data():data """<?xml version"1.0"?><shampoo><Header>Apply shampoo here.</Header&…...
C++ //练习 15.9 在什么情况下表达式的静态类型可能与动态类型不同?请给出三个静态类型与动态类型不同的例子。
C Primer(第5版) 练习 15.9 练习 15.9 在什么情况下表达式的静态类型可能与动态类型不同?请给出三个静态类型与动态类型不同的例子。 环境:Linux Ubuntu(云服务器) 工具:vim 解释 当print_t…...
斐波那契查找算法
斐波那契查找原理,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近,即midlowF(k-1)-1(F代表斐波那契数列) F[k]F[k-1]F[k-2],>(F[k]-1) (F[k-1]-1)(F[k-2]-1)1 说明:只要顺序表的长度为F[k]-1,则可以将该…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...