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,则可以将该…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析
1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器(TI)推出的一款 汽车级同步降压转换器(DC-DC开关稳压器),属于高性能电源管理芯片。核心特性包括: 输入电压范围:2.95V–6V,输…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
