从MySQL迁移到PostgreSQL的完整指南
1.引言
在现代数据库管理中,选择合适的数据库系统对业务的成功至关重要。随着企业数据量的增长和对性能要求的提高,许多公司开始考虑从MySQL迁移到PostgreSQL。这一迁移的主要原因包括以下几个方面:
1.1 性能和扩展性
PostgreSQL以其高性能和优秀的扩展能力而闻名。它支持复杂的查询优化和并发控制,能够更高效地处理大规模数据。与MySQL相比,PostgreSQL在处理复杂查询和大数据集时表现更为出色。
1.2. 标准兼容性和功能丰富
PostgreSQL严格遵循SQL标准,并提供了许多高级功能,如完整的ACID事务支持、复杂的查询和索引功能、存储过程、触发器等。其丰富的功能集使得开发人员能够更加灵活地设计和实现各种数据库应用。
1.3. 开源社区和企业支持
PostgreSQL拥有一个活跃的开源社区和广泛的企业支持。无论是社区版本还是企业版本,用户都可以获得及时的技术支持和更新。这使得PostgreSQL在稳定性和安全性方面具有显著优势。
1.4. 迁移过程中的挑战和注意事项
尽管从MySQL迁移到PostgreSQL带来了诸多优势,但这一过程也伴随着一些挑战和注意事项:
1.4.1. 语法差异
MySQL和PostgreSQL在SQL语法上存在一些差异,特别是在存储过程、函数和触发器的实现上。在迁移过程中,需要对现有的SQL脚本进行适当的调整和转换,以确保在PostgreSQL中能够正常运行。
1.4.2. 数据类型兼容性
两者在数据类型的支持和实现上也存在差异。例如,MySQL的TINYINT在PostgreSQL中没有直接对应的类型,需要转换为SMALLINT。类似的差异需要在迁移前进行详细的审查和处理。
1.4.3. 性能优化
尽管PostgreSQL在性能上具有优势,但迁移后仍需要对系统进行性能调优。包括索引的重新创建、查询的优化等,以充分发挥PostgreSQL的性能优势。
1.4.4. 数据完整性验证
在迁移过程中,确保数据的一致性和完整性至关重要。需要进行全面的数据验证,确保迁移后的数据与原数据完全一致。这包括行数验证、数据对比以及存储过程和函数的功能测试。
1.4.5. 工具的选择
选择合适的迁移工具可以显著简化迁移过程。例如,pgloader、Navicat等工具可以帮助大家完成大部份迁移步骤,减少手动干预的错误风险。关于pgloader的工具使用,可以查看pgloader官方文档,在这里就不赘述了,后续如果有需要可以针对pgloader的使用给大家进行分享。
2. 迁移步骤
将数据从一个数据库系统迁移到另一个数据库系统是一个复杂且关键的任务。以下是从MySQL迁移到PostgreSQL的完整过程,涵盖了所有相关步骤。
2.1 准备工作
2.1.1. 安装并配置MySQL和PostgreSQL
在开始迁移之前,确保MySQL和PostgreSQL都已正确安装并配置。准备工作包括安装和配置数据库系统以及备份MySQL数据库。对于Mysql、PostgreSQL的配置安装可以通过yum或者apt命令进行联网安装,也可以通过二进制进行安装,具体可以参考:
- PostgreSQL16.3基于CentOS7.9源码安装步骤
- 数据库MySQL的四种安装方式
2.1.2. 备份MySQL数据库
在进行数据迁移之前,必须备份MySQL数据库以防止数据丢失。备份可以使用mysqldump工具完成。
1.备份整个数据库
使用mysqldump命令导出整个数据库,包括表结构和数据。
mysqldump -u root -p your_database > your_database_backup.sql
2.备份单个表:
如果只需要备份特定的表,可以使用以下命令:
mysqldump -u root -p your_database table_name > table_name_backup.sql
3.备份存储过程和函数:
使用--routines选项导出存储过程和函数。
mysqldump -u root -p --routines --no-create-info --no-data --skip-triggers your_database > routines_backup.sql
4.验证备份文件:
确保备份文件已正确生成,并且可以读取。可以简单地查看备份文件的内容:
less your_database_backup.sql
通过完成以上准备工作,可以确保MySQL和PostgreSQL环境已正确设置,并且数据已备份,为接下来的迁移步骤打下基础。
2.2 迁移表结构
在迁移表结构时,数据类型的转换是关键的一步。MySQL和PostgreSQL在数据类型的支持和实现上有一些差异,需要进行适当的映射和转换。以下是常用数据类型的对比:
数据类型对比
MySQL
PostgreSQL
说明
TINYINT
SMALLINT
小范围整数,PostgreSQL没有直接的TINYINT,需要转换为SMALLINT
SMALLINT
SMALLINT
小范围整数
MEDIUMINT
INTEGER
中等范围整数,PostgreSQL没有直接的MEDIUMINT,可以转换为INTEGER
INT
INTEGER
标准整数类型
BIGINT
BIGINT
大范围整数
FLOAT
REAL
单精度浮点数
DOUBLE
DOUBLE PRECISION
双精度浮点数
DECIMAL
DECIMAL
精确的小数
NUMERIC
NUMERIC
精确的小数,等同于DECIMAL
CHAR
CHAR
定长字符串
VARCHAR
VARCHAR
可变长度字符串
TINYTEXT
TEXT
小文本字段,PostgreSQL用TEXT替代
TEXT
TEXT
文本字段
MEDIUMTEXT
TEXT
中等大小文本字段,PostgreSQL用TEXT替代
LONGTEXT
TEXT
大文本字段,PostgreSQL用TEXT替代
DATE
DATE
日期
DATETIME
TIMESTAMP
日期和时间,PostgreSQL用TIMESTAMP替代
TIME
TIME
时间
YEAR
INTEGER
年份,PostgreSQL没有直接的YEAR类型,可以使用INTEGER
ENUM
VARCHAR
枚举类型,PostgreSQL没有直接的ENUM,可以使用VARCHAR
SET
VARCHAR
集合类型,PostgreSQL没有直接的SET,可以使用VARCHAR
BLOB
BYTEA
二进制大对象
TINYBLOB
BYTEA
小二进制对象,PostgreSQL用BYTEA替代
MEDIUMBLOB
BYTEA
中等大小二进制对象,PostgreSQL用BYTEA替代
LONGBLOB
BYTEA
大二进制对象,PostgreSQL用BYTEA替代
迁移步骤:
- 导出MySQL表结构: 使用
mysqldump命令导出MySQL数据库的表结构。- 转换表结构为PostgreSQL兼容格式: 根据上表中的数据类型对比,手动或使用工具调整导出的SQL文件,确保数据类型在PostgreSQL中正确映射。
- 导入到PostgreSQL: 使用
psql命令将转换后的表结构导入到PostgreSQL中,创建所需的表和列。
注意事项:
- 在进行数据类型转换时,需特别注意数据类型的精度和范围,确保在PostgreSQL中的数据类型能够满足原MySQL数据的需求。
- 特殊数据类型的转化,例如:MySQL当中的
TINYINT(1)表示Boolean的字段,在PostgreSQL需要转化为Boolean类型;PostgreSQL没有MySQL的BLOB类型,所以需要把BLOB类型转化为BYTEA
2.3 迁移数据
迁移数据是从MySQL到PostgreSQL过程中最关键的一步。这个过程涉及导出MySQL数据、转换数据格式、导入到PostgreSQL以及验证数据的一致性。以下是详细的步骤描述。
2.3.1. 导出MySQL数据
首先,需要将MySQL数据库中的数据导出为一个文件。这可以通过使用mysqldump工具来实现。
导出步骤:
- 打开终端。
- 使用
mysqldump命令导出数据mysqldump -u [username] -p [database_name] --no-create-info > data_backup.sql其中:
[username]是MySQL的用户名。[database_name]是要导出的数据库名称。--no-create-info选项表示只导出数据,不包括表结构。
2. 转换数据文件格式
由于MySQL和PostgreSQL的数据格式有所不同,需要将导出的MySQL数据文件转换为适合PostgreSQL的格式。pgloader是一个强大的工具,可以简化这个过程。
转换步骤:
- 安装
pgloader(如果尚未安装):sudo yum install pgloader -y- 使用
pgloader进行数据转换和导入:
pgloader mysql://[username]:[password]@localhost/[database_name] postgresql://[pg_username]:[pg_password]@localhost/[pg_database_name]
其中:
[username]和[password]是MySQL的用户名和密码[database_name]是MySQL数据库的名称[pg_username]和[pg_password]是PostgreSQL的用户名和密码[pg_database_name]是PostgreSQL数据库的名称
3. 导入到PostgreSQL
如果没有使用pgloader,需要手动将数据文件导入到PostgreSQL。
导入步骤:
- 打开终端。
- 使用
psql命令导入数据。psql -U [pg_username] -d [pg_database_name] -f data_backup.sql其中:
[pg_username]是PostgreSQL的用户名。[pg_database_name]是要导入数据的PostgreSQL数据库名称。data_backup.sql是导出的MySQL数据文件。
4. 数据完整性验证
在数据导入后,需要进行数据完整性验证,以确保数据迁移过程中没有丢失或损坏。
验证步骤:
- 行数验证:
在MySQL和PostgreSQL中分别查询每个表的行数,确保行数一致。SELECT COUNT(*) FROM table_name;- 数据对比:
随机抽取若干条记录,比较MySQL和PostgreSQL中的数据是否一致。SELECT * FROM table_name WHERE id = random_id;- 完整性检查
确保所有外键、唯一约束等数据库完整性规则在PostgreSQL中正确实现- 业务逻辑验证
使用应用程序的业务逻辑进行数据验证。编写脚本或程序调用应用程序接口,验证数据是否符合预期- 数据范围和分布验证
验证特定列的数据范围和分布是否一致。例如,检查日期列的最小值和最大值是否相同- NULL值验证
检查各个表中NULL值的分布是否一致- 聚合函数验证
使用聚合函数(如:SUM、AVG、MAX、MIN)验证数据的一致性- 应用程序功能测试
通过应用程序执行常规操作,验证迁移后的数据是否支持应用程序的正常运行。包括数据插入、更新、删除和查询等操作
注意事项:
- 字符编码:确保MySQL和PostgreSQL的字符编码一致,避免出现乱码问题。
- 事务处理:在数据导入过程中使用事务,以确保数据的一致性和完整性。
- 索引和约束:在导入数据前,可以暂时禁用索引和约束,提高数据导入速度。导入完成后再重新在PostgreSQL侧进行重建。
2.4 迁移存储过程和函数
将MySQL的存储过程和函数迁移到PostgreSQL时,需要了解两者之间的系统函数和语法差异。以下是详细的对比表格:
迁移步骤:
- 导出MySQL存储过程和函数:
使用mysqldump命令导出MySQL数据库中的存储过程和函数。mysqldump -u [username] -p --routines --no-create-info --no-data --skip-triggers [database_name] > routines_backup.sql- 转换存储过程和函数为PostgreSQL兼容格式
手动调整导出的存储过程和函数,使其适应PostgreSQL的语法- 导入到PostgreSQL
使用psql命令将转换后的存储过程和函数导入到PostgreSQL中。psql -U [pg_username] -d [pg_database_name] -f routines_backup_pg.sql
2.4.1 系统函数对比
功能
MySQL
PostgreSQL
当前日期和时间
NOW()
CURRENT_TIMESTAMP
当前用户
CURRENT_USER()
CURRENT_USER
字符串长度
CHAR_LENGTH(string)
LENGTH(string)
数学函数
ABS(number), ROUND(number)
ABS(number), ROUND(number)
随机数生成
RAND()
RANDOM()
子字符串
SUBSTRING(string, pos, len)
SUBSTRING(string FROM pos FOR len)
日期加减
DATE_ADD(date, INTERVAL expr unit)
date + interval 'expr unit'
日期格式化
DATE_FORMAT(date, format)
TO_CHAR(date, format)
2.4.2 语法对比
功能/特性
MySQL
PostgreSQL
存储过程定义
CREATE PROCEDURE proc_name (params) BEGIN ... END;
CREATE OR REPLACE PROCEDURE proc_name (params) LANGUAGE plpgsql AS $$ BEGIN ... END; $$;
函数定义
CREATE FUNCTION func_name (params) RETURNS type BEGIN ... END;
CREATE OR REPLACE FUNCTION func_name (params) RETURNS type LANGUAGE plpgsql AS $$ DECLARE ... BEGIN ... END; $$;
参数
输入、输出、输入输出参数
输入参数(默认),使用IN、OUT、INOUT指定
变量声明
DECLARE var_name type;
DECLARE var_name type; 在DECLARE块中
异常处理
DECLARE ... HANDLER
EXCEPTION 块
条件控制
IF ... THEN ... ELSE ... END IF;
IF ... THEN ... ELSE ... END IF;
循环控制
WHILE ... DO ... END WHILE;
WHILE ... LOOP ... END LOOP;
结果集处理
SELECT ... INTO var;
SELECT ... INTO var;
2.4.3 示例说明
-
在MySQL中定义存储过程和函数
– 存储过程
DELIMITER //
CREATE PROCEDURE example_procedure(IN param1 INT)
BEGIN
SELECT * FROM example_table WHERE id = param1;
END //
DELIMITER ;– 函数
DELIMITER //
CREATE FUNCTION example_function(param1 INT) RETURNS INT
BEGIN
DECLARE result INT;
SELECT column INTO result FROM example_table WHERE id = param1;
RETURN result;
END //
DELIMITER ; -
在PostgreSQL中转换存储过程和函数
– 存储过程
CREATE OR REPLACE PROCEDURE example_procedure(param1 INT)
LANGUAGE plpgsql
AS B E G I N S E L E C T ∗ F R O M e x a m p l e t a b l e W H E R E i d = p a r a m 1 ; E N D ; BEGIN SELECT * FROM example_table WHERE id = param1; END; BEGINSELECT∗FROMexampletableWHEREid=param1;END;;– 函数
CREATE OR REPLACE FUNCTION example_function(param1 INT) RETURNS INT
LANGUAGE plpgsql
AS D E C L A R E r e s u l t I N T ; B E G I N S E L E C T c o l u m n I N T O r e s u l t F R O M e x a m p l e t a b l e W H E R E i d = p a r a m 1 ; R E T U R N r e s u l t ; E N D ; DECLARE result INT; BEGIN SELECT column INTO result FROM example_table WHERE id = param1; RETURN result; END; DECLAREresultINT;BEGINSELECTcolumnINTOresultFROMexampletableWHEREid=param1;RETURNresult;END;;
2.4.3 存储过程和函数测试
迁移完成后,存储过程和函数的测试是确保迁移成功的重要步骤。测试的目的是验证在PostgreSQL中存储过程和函数的功能是否与在MySQL中一致,主要从如下几方面进行测试验证:
- 功能测试
需要确保每个存储过程和函数在PostgreSQL中按预期工作。可以通过创建测试用例来调用每个存储过程和函数,并验证其输出是否正确。例如,对于存储过程get_user_by_id,可以在PostgreSQL中执行CALL get_user_by_id(1);,并检查返回结果是否正确。- 性能测试
对比MySQL和PostgreSQL中存储过程和函数的执行时间,确保性能没有显著下降。这可以通过在两个数据库中分别执行相同的存储过程或函数,并记录其执行时间来实现。例如,在MySQL中执行CALL get_user_by_id(1);,然后在PostgreSQL中执行相同的命令,并比较执行时间。- 边界测试
测试存储过程和函数的边界情况,如最大和最小输入值,空值处理,异常情况等。例如,可以在PostgreSQL中执行CALL
get_user_by_id(NULL);、CALL get_user_by_id(-1);和CALL
get_user_by_id(99999999);,以确保存储过程和函数能够正确处理各种输入情况。- 集成测试
通过应用程序执行常规操作,验证迁移后的数据是否支持应用程序的正常运行。这包括在应用程序中调用存储过程和函数,并验证结果是否与预期一致。例如,在Java应用程序中,通过JDBC连接到PostgreSQL数据库,调用存储过程get_user_by_id,并检查返回结果是否正确。
3.注意事项
数据的迁移大多都是基于实际的生成环境中进行,为了尽可能减少对于业务的影响,我们应该通过细致的规划和执行,合理的停机时长规划、应用改造和生产环境验证等来确保迁移过程的顺利和成功,最大程度地减少对业务的影响,一下为在整个迁移过程中需要考虑的注意事项:
1.停机时长的考虑
迁移过程中,停机时长是一个重要的考虑因素。数据量越大,迁移所需的时间越长。因此,建议在数据量较少或业务低峰期进行迁移,以减少对生产环境的影响。为了确保数据的一致性,在停机前需要备份所有数据,并确保在迁移过程中不进行数据修改。
2.缩短停机时间的方法
为了尽可能缩短停机时间,可以考虑使用增量备份和恢复的方法,减少全量数据备份和恢复所需的时间。此外,提前准备好迁移所需的脚本和配置,可以减少实际迁移操作的时间。
3.代码兼容性
迁移过程中,需要修改应用程序的数据库连接配置,确保连接到PostgreSQL。同时,检查并修改应用程序中所有的SQL查询,确保其在PostgreSQL中能够正确执行。尤其注意MySQL特有的语法和函数,需替换为PostgreSQL兼容的语法和函数。
4.功能验证
迁移完成后,需要进行功能验证。编写和执行单元测试,确保应用程序中的所有功能在使用PostgreSQL时能够正常运行。此外,在测试环境中进行全面的集成测试,模拟生产环境中的实际操作,确保所有业务流程能够正常执行。
5.数据验证
数据验证是迁移过程中的关键步骤。使用行数验证、数据对比、校验和验证等方法,确保迁移后数据的完整性和一致性。同时,验证特定列的数据范围和分布是否一致,如日期列的最小值和最大值是否相同。
6.性能验证
性能验证也是迁移过程中不可忽视的一部分。对比迁移前后关键查询的执行时间,确保PostgreSQL中的查询性能满足需求。通过性能测试,确保PostgreSQL中的存储过程和函数的执行时间在可接受范围内。
7.系统稳定性
为了确保系统的稳定性,建议在生产环境中进行压力测试,验证系统在高负载下的稳定性和性能。同时,设置详细的监控和日志记录,及时发现和解决潜在的问题。
8.关键注意事项
在进行任何迁移操作前,务必做好全面的数据备份,以防迁移过程中出现数据丢失或损坏的情况。制定详细的迁移计划,包括每个步骤的时间安排、责任人和应急预案。如果可能,分阶段逐步实施迁移,逐步验证每个阶段的结果,以降低整体迁移的风险。
总结
从MySQL迁移到PostgreSQL是一个复杂但必要的过程,它能够为系统带来更高的性能、丰富的功能集和更强的扩展能力。整个迁移过程包括准备工作、迁移表结构、迁移数据、迁移存储过程和函数以及数据完整性验证。在每个步骤中都需要细致的规划和执行,以确保数据的一致性和完整性。
在迁移过程中,需要仔细考虑停机时长、应用改造以及生产环境中的实际验证。停机时长的规划直接影响业务的连续性,建议在业务低峰期进行迁移,并使用增量备份和恢复的方法以缩短停机时间。应用改造方面,需修改数据库连接配置和SQL查询,确保兼容PostgreSQL。生产环境验证是确保迁移成功的关键步骤,包括数据验证、性能验证和系统稳定性测试。通过行数验证、数据对比、校验和验证等方法,可以确保数据的完整性和一致性。同时,性能测试和压力测试能够确保系统在迁移后的高效稳定运行。
通过细致的规划和执行,从MySQL迁移到PostgreSQL不仅能够提升系统性能,还能为未来的发展打下坚实的基础。希望本文提供的详细步骤和注意事项能够帮助您顺利完成迁移过程,实现系统的平稳过渡和功能增强。
参考链接
以下是一些关于从MySQL迁移到PostgreSQL的参考文章和链接,这些资源可以为您提供更多的技术细节:
- PostgreSQL Official Documentation
- MySQL to PostgreSQL Migration Guide
- pgloader Documentation
- mysqldump Documentation
相关文章:
从MySQL迁移到PostgreSQL的完整指南
1.引言 在现代数据库管理中,选择合适的数据库系统对业务的成功至关重要。随着企业数据量的增长和对性能要求的提高,许多公司开始考虑从MySQL迁移到PostgreSQL。这一迁移的主要原因包括以下几个方面: 1.1 性能和扩展性 PostgreSQL以其高性能…...
服务器一次性部署One API + ChatGPT-Next-Web
服务器一次性部署One API ChatGPT-Next-Web One API ChatGPT-Next-Web 介绍One APIChatGPT-Next-Web docker-compose 部署One API ChatGPT-Next-WebOpen API docker-compose 配置ChatGPT-Next-Web docker-compose 配置docker-compose 启动容器 后续配置 同步发布在个人笔记服…...
51单片机 和 STM32 的烧录方式和通信协议的区别
51单片机 和 STM32 的烧录方式和通信协议的区别 1. 为什么51单片机需要额外的软件(如ISP)? (1)51单片机的烧录方式 ISP(In-System Programming): 51单片机通常通过 串口(…...
(STM32笔记)十二、DMA的基础知识与用法 第二部分
我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。 DMA的基础知识与用法 二、DMA传输设置1、数据来源与数据去向外设到存储器存储器到外设存储器到存储器 2、每次传输大小3、传…...
【优选算法篇】:模拟算法的力量--解决复杂问题的新视角
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:优选算法篇–CSDN博客 文章目录 一.模拟算法二.例题1.替换所有的问号2.提莫攻击3.外观数列4…...
探秘 JMeter (Interleave Controller)交错控制器:解锁性能测试的隐藏密码
嘿,小伙伴们!今天咱们要把 JMeter 里超厉害的 Interleave Controller(交错控制器)研究个透,让你从新手直接进阶成高手,轻松拿捏各种性能测试难题! 一、Interleave Controller 深度剖析 所属家族…...
脚本化挂在物理盘、nfs、yum、pg数据库、nginx(已上传脚本)
文章目录 前言一、什么是脚本化安装二、使用步骤1.物理磁盘脚本挂载(离线)2.yum脚本化安装(离线)3.nfs脚本化安装(离线)4.pg数据库脚本化安装(离线)5.nginx脚本化安装(离…...
ESP嵌入式开发环境安装
前期准备,虚拟机,ios镜像,VSCode。 centOS8:centos安装包下载_开源镜像站-阿里云 虚拟机:vmware VSCode:Visual Studio Code - Code Editing. Redefined 如何安装镜像自行查找 完成以上环境后进行一下操…...
Elasticsearch入门学习
Elasticsearch是什么 Elasticsearch 是一个基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展的数据存储和矢量数据库。 它针对生产规模工作负载的速度和相关性进行了优化。 使用 Elasticsearch 近乎实时地搜索、索引、存储和分析各种形状和大小的数据。 特点 分布式&a…...
黑马linux笔记(03)在Linux上部署各类软件 MySQL5.7/8.0 Tomcat(JDK) Nginx RabbitMQ
文章目录 实战章节:在Linux上部署各类软件tar -zxvf各个选项的含义 为什么学习各类软件在Linux上的部署 一 MySQL数据库管理系统安装部署【简单】MySQL5.7版本在CentOS系统安装MySQL8.0版本在CentOS系统安装MySQL5.7版本在Ubuntu(WSL环境)系统…...
《软硬协同优化,解锁鸿蒙系统AI应用性能新高度》
在当今数字化时代,鸿蒙系统与人工智能的融合正逐渐成为科技领域的热门话题。如何通过软件和硬件协同优化,进一步提升鸿蒙系统中AI应用的整体性能,成为了开发者和技术爱好者们关注的焦点。 鸿蒙系统与AI应用的融合现状 鸿蒙系统以其独特的微…...
利用 Tree Shaking 提升 React.js 性能
Tree Shaking 是现代 JavaScript 应用中不可或缺的优化技术,它通过移除未使用的代码来减少最终打包的大小。对于 React.js 应用,这一技术尤为重要,因为随着组件和第三方库的增多,打包体积可能迅速膨胀。Tree Shaking 能显著提升加…...
RPC实现原理,怎么跟调用本地一样
回答1 要让⽹络通信细节对使⽤者透明,我们需要对通信细节进⾏封装,我们先看下⼀个 RPC 调⽤的流程涉及到哪些通 信细节: 1. 服务消费⽅( client )调⽤以本地调⽤⽅式调⽤服务; 2. client stub 接收到调…...
Vue进阶之AI智能助手项目(二)——ChatGPT的调用和开发
AI智能助手项目 service服务端文件目录src目录详解src/index.tschatGPT:src/chatgpt/index.ts前端接口部分src/api/index.tssrc/utils/request/index.tspost方法httpHttpOptionsrc/utils/request/axios.tsLayout布局页面-viewsexception异常页面src/views/exception/404/index…...
python学opencv|读取图像(二十九)使用cv2.getRotationMatrix2D()函数旋转缩放图像
【1】引言 前序已经学习了如何平移图像,相关文章链接为: python学opencv|读取图像(二十七)使用cv2.warpAffine()函数平移图像-CSDN博客 在此基础上,我们尝试旋转图像的同时缩放图像。 【2】…...
2025-微服务—SpringCloud-1~3
2025-微服务—SpringCloud 第一章、从Boot和Cloud版本选型开始说起1、Springboot版本2、Springcloud版本3、Springcloud Alibaba4、本次讲解定稿版 第二章 关于Cloud各种组件的停更/升级/替换1、微服务介绍2、SpringCloud是什么?能干吗?产生背景…...
UnityXR Interaction Toolkit 如何检测HandGestures
前言 随着VR设备的不断发展,从最初的手柄操作,逐渐演变出了手部交互,即头显可以直接识别玩家的手部动作,来完成手柄的交互功能。我们今天就来介绍下如何使用Unity的XR Interaction Toolkit 来检测手势Hand Gesture。 环境配置 1.使用Unity 2021或者更高版本,创建一个项…...
使用 Multer 上传图片到阿里云 OSS
文件上传到哪里更好? 上传到服务器本地 上传到服务器本地,这种方法在现今商业项目中,几乎已经见不到了。因为服务器带宽,磁盘 IO 都是非常有限的。将文件上传和读取放在自己服务器上,并不是明智的选择。 上传到云储存…...
2008-2020年各省社会消费品零售总额数据
2008-2020年各省社会消费品零售总额数据 1、时间:2008-2020年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、社会消费品零售总额 4、范围:31省 5、指标解释:社会消费品零售总额指企业&#x…...
【大模型入门指南 07】量化技术浅析
【大模型入门指南】系列文章: 【大模型入门指南 01】深度学习入门【大模型入门指南 02】LLM大模型基础知识【大模型入门指南 03】提示词工程【大模型入门指南 04】Transformer结构【大模型入门指南 05】LLM技术选型【大模型入门指南 06】LLM数据预处理【大模型入门…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
