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

Python数据库编程全面指南:从SQL到NoSQL

Python数据库编程全面指南从SQL到NoSQL1. 背景介绍数据库是现代应用程序的核心组件之一用于存储和管理数据。Python作为一种广泛使用的编程语言提供了丰富的库和工具来与各种数据库进行交互。本文将全面介绍Python数据库编程包括关系型数据库如SQLite、MySQL、PostgreSQL和NoSQL数据库如MongoDB、Redis的使用方法帮助开发者选择合适的数据库技术并编写高效的数据库应用。2. 核心概念与技术2.1 数据库类型关系型数据库基于关系模型使用SQL进行查询如SQLite、MySQL、PostgreSQLNoSQL数据库非关系型数据库包括文档型MongoDB、键值型Redis、列族型HBase和图数据库Neo4j2.2 数据库连接技术ODBC开放数据库连接一种标准的数据库访问方法JDBCJava数据库连接主要用于Java应用ORM对象关系映射将数据库表映射到编程语言中的对象原生驱动数据库厂商提供的专用驱动2.3 Python数据库库sqlite3Python标准库用于连接SQLite数据库PyMySQL用于连接MySQL数据库psycopg2用于连接PostgreSQL数据库pymongo用于连接MongoDB数据库redis-py用于连接Redis数据库SQLAlchemy强大的ORM库支持多种数据库Django ORMDjango框架内置的ORM3. 代码实现3.1 SQLite数据库操作import sqlite3 # 连接到SQLite数据库 # 如果数据库不存在会自动创建 conn sqlite3.connect(example.db) # 创建游标 cursor conn.cursor() # 创建表 cursor.execute( CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, age INTEGER ) ) # 插入数据 cursor.execute(INSERT INTO users (name, email, age) VALUES (?, ?, ?), (Alice, aliceexample.com, 30)) cursor.execute(INSERT INTO users (name, email, age) VALUES (?, ?, ?), (Bob, bobexample.com, 25)) # 提交事务 conn.commit() # 查询数据 cursor.execute(SELECT * FROM users) users cursor.fetchall() print(All users:) for user in users: print(user) # 条件查询 cursor.execute(SELECT * FROM users WHERE age ?, (27,)) older_users cursor.fetchall() print(\nUsers older than 27:) for user in older_users: print(user) # 更新数据 cursor.execute(UPDATE users SET age ? WHERE name ?, (31, Alice)) conn.commit() # 删除数据 cursor.execute(DELETE FROM users WHERE name ?, (Bob,)) conn.commit() # 再次查询验证 cursor.execute(SELECT * FROM users) users cursor.fetchall() print(\nUsers after update:) for user in users: print(user) # 关闭连接 cursor.close() conn.close()3.2 MySQL数据库操作import pymysql # 连接到MySQL数据库 conn pymysql.connect( hostlocalhost, userroot, passwordpassword, databasetest_db, charsetutf8mb4, cursorclasspymysql.cursors.DictCursor ) # 创建游标 cursor conn.cursor() # 创建表 cursor.execute( CREATE TABLE IF NOT EXISTS products ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, price DECIMAL(10, 2) NOT NULL, stock INT DEFAULT 0 ) ) # 插入数据 products [ (Laptop, 999.99, 50), (Smartphone, 699.99, 100), (Tablet, 399.99, 75) ] cursor.executemany(INSERT INTO products (name, price, stock) VALUES (%s, %s, %s), products) conn.commit() # 查询数据 cursor.execute(SELECT * FROM products) products cursor.fetchall() print(All products:) for product in products: print(product) # 条件查询 cursor.execute(SELECT * FROM products WHERE price %s, (500,)) expensive_products cursor.fetchall() print(\nProducts more expensive than $500:) for product in expensive_products: print(product) # 更新数据 cursor.execute(UPDATE products SET stock stock - 10 WHERE name %s, (Laptop,)) conn.commit() # 删除数据 cursor.execute(DELETE FROM products WHERE name %s, (Tablet,)) conn.commit() # 再次查询验证 cursor.execute(SELECT * FROM products) products cursor.fetchall() print(\nProducts after update:) for product in products: print(product) # 关闭连接 cursor.close() conn.close()3.3 PostgreSQL数据库操作import psycopg2 # 连接到PostgreSQL数据库 conn psycopg2.connect( hostlocalhost, databasetest_db, userpostgres, passwordpassword ) # 创建游标 cursor conn.cursor() # 创建表 cursor.execute( CREATE TABLE IF NOT EXISTS employees ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, department VARCHAR(100) NOT NULL, salary DECIMAL(10, 2) NOT NULL, hire_date DATE ) ) # 插入数据 employees [ (John Doe, Engineering, 80000.00, 2020-01-15), (Jane Smith, Marketing, 65000.00, 2020-02-20), (Mike Johnson, Sales, 70000.00, 2020-03-10) ] cursor.executemany(INSERT INTO employees (name, department, salary, hire_date) VALUES (%s, %s, %s, %s), employees) conn.commit() # 查询数据 cursor.execute(SELECT * FROM employees) employees cursor.fetchall() print(All employees:) for employee in employees: print(employee) # 条件查询 cursor.execute(SELECT * FROM employees WHERE salary %s, (68000,)) high_earners cursor.fetchall() print(\nEmployees with salary $68000:) for employee in high_earners: print(employee) # 更新数据 cursor.execute(UPDATE employees SET salary salary * 1.1 WHERE department %s, (Engineering,)) conn.commit() # 删除数据 cursor.execute(DELETE FROM employees WHERE name %s, (Mike Johnson,)) conn.commit() # 再次查询验证 cursor.execute(SELECT * FROM employees) employees cursor.fetchall() print(\nEmployees after update:) for employee in employees: print(employee) # 关闭连接 cursor.close() conn.close()3.4 MongoDB数据库操作from pymongo import MongoClient # 连接到MongoDB client MongoClient(mongodb://localhost:27017/) # 创建或选择数据库 db client[test_db] # 创建或选择集合 users_collection db[users] # 插入单个文档 user1 { name: Alice, email: aliceexample.com, age: 30, address: { street: 123 Main St, city: New York, zipcode: 10001 }, interests: [reading, hiking, coding] } result users_collection.insert_one(user1) print(fInserted user with ID: {result.inserted_id}) # 插入多个文档 users [ { name: Bob, email: bobexample.com, age: 25, address: { street: 456 Elm St, city: Los Angeles, zipcode: 90210 }, interests: [gaming, sports] }, { name: Charlie, email: charlieexample.com, age: 35, address: { street: 789 Oak St, city: Chicago, zipcode: 60601 }, interests: [cooking, travel] } ] result users_collection.insert_many(users) print(fInserted {len(result.inserted_ids)} users) # 查询所有文档 print(\nAll users:) for user in users_collection.find(): print(user) # 条件查询 print(\nUsers older than 28:) for user in users_collection.find({age: {$gt: 28}}): print(user) # 复杂查询 print(\nUsers in New York with interest in coding:) for user in users_collection.find({ address.city: New York, interests: coding }): print(user) # 更新文档 result users_collection.update_one( {name: Alice}, {$set: {age: 31, email: alice Updatedexample.com}} ) print(f\nUpdated {result.modified_count} document) # 删除文档 result users_collection.delete_one({name: Bob}) print(fDeleted {result.deleted_count} document) # 再次查询验证 print(\nUsers after update:) for user in users_collection.find(): print(user) # 关闭连接 client.close()3.5 Redis数据库操作import redis # 连接到Redis r redis.Redis( hostlocalhost, port6379, db0, decode_responsesTrue ) # 字符串操作 r.set(name, Alice) name r.get(name) print(fName: {name}) r.setex(expiring_key, 10, This key will expire in 10 seconds) print(fExpiring key: {r.get(expiring_key)}) # 哈希操作 r.hset(user:1, name, Alice) r.hset(user:1, age, 30) r.hset(user:1, email, aliceexample.com) user r.hgetall(user:1) print(f\nUser: {user}) # 列表操作 r.lpush(fruits, apple, banana, cherry) fruits r.lrange(fruits, 0, -1) print(f\nFruits: {fruits}) # 集合操作 r.sadd(tags, python, programming, database) tags r.smembers(tags) print(f\nTags: {tags}) # 有序集合操作 r.zadd(scores, {Alice: 95, Bob: 85, Charlie: 90}) top_scores r.zrevrange(scores, 0, 2, withscoresTrue) print(f\nTop scores: {top_scores}) # 计数器 r.incr(visits) visits r.get(visits) print(f\nVisits: {visits}) # 事务 pipe r.pipeline() pipe.multi() pipe.set(key1, value1) pipe.set(key2, value2) pipe.execute() print(f\nKey1: {r.get(key1)}) print(fKey2: {r.get(key2)}) # 关闭连接 r.close()3.6 SQLAlchemy ORM操作from sqlalchemy import create_engine, Column, Integer, String, Float, Date from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 创建数据库引擎 engine create_engine(sqlite:///example.db) # 创建基类 Base declarative_base() # 定义模型 class Employee(Base): __tablename__ employees id Column(Integer, primary_keyTrue) name Column(String, nullableFalse) department Column(String, nullableFalse) salary Column(Float, nullableFalse) hire_date Column(Date) def __repr__(self): return fEmployee(name{self.name}, department{self.department}, salary{self.salary}) # 创建表 Base.metadata.create_all(engine) # 创建会话 Session sessionmaker(bindengine) session Session() # 插入数据 employee1 Employee(nameJohn Doe, departmentEngineering, salary80000.00) employee2 Employee(nameJane Smith, departmentMarketing, salary65000.00) session.add_all([employee1, employee2]) session.commit() # 查询数据 print(All employees:) employees session.query(Employee).all() for employee in employees: print(employee) # 条件查询 print(\nEmployees with salary 70000:) high_earners session.query(Employee).filter(Employee.salary 70000).all() for employee in high_earners: print(employee) # 更新数据 employee1.salary 85000.00 session.commit() # 删除数据 session.delete(employee2) session.commit() # 再次查询验证 print(\nEmployees after update:) employees session.query(Employee).all() for employee in employees: print(employee) # 关闭会话 session.close()4. 性能与效率分析4.1 不同数据库的性能比较数据库读写速度并发处理数据一致性存储开销适用场景SQLite快低高低小型应用、嵌入式系统MySQL中中高中中小型Web应用PostgreSQL中高高中大型企业应用、复杂查询MongoDB快高中高大数据、实时应用Redis极快高中高缓存、会话存储、实时数据4.2 性能优化技巧索引优化为频繁查询的列创建索引查询优化使用EXPLAIN分析查询执行计划优化SQL语句连接池使用连接池减少连接建立和关闭的开销批量操作使用批量插入和更新减少网络往返缓存使用Redis等缓存减少数据库访问分区对大型表进行分区提高查询性能读写分离将读操作和写操作分离到不同的数据库实例5. 最佳实践5.1 数据库选择小型应用SQLiteWeb应用MySQL或PostgreSQL大数据应用MongoDB缓存和实时数据Redis复杂查询和事务PostgreSQL5.2 连接管理使用上下文管理器确保连接正确关闭设置连接超时避免连接挂起使用连接池提高性能和可靠性5.3 安全实践参数化查询防止SQL注入密码加密存储密码的哈希值最小权限原则为数据库用户分配最小必要的权限数据验证在应用层验证输入数据定期备份确保数据安全5.4 代码组织分层架构将数据访问逻辑与业务逻辑分离使用ORM减少重复代码提高可维护性异常处理适当处理数据库异常日志记录记录数据库操作和错误6. 应用场景6.1 Web应用用户管理存储用户信息和认证数据内容管理存储文章、评论等内容电子商务存储产品、订单、支付信息6.2 数据分析数据仓库存储和分析大量历史数据实时分析处理和分析实时数据流商业智能生成报表和可视化6.3 物联网传感器数据存储设备采集的数据设备管理管理设备信息和状态实时监控监控设备状态和异常6.4 游戏开发玩家数据存储玩家信息和进度游戏状态存储游戏世界状态排行榜存储和更新游戏排行榜6.5 移动应用本地存储使用SQLite进行本地数据存储云端同步与云数据库同步数据用户偏好存储用户设置和偏好7. 总结与展望Python数据库编程是现代应用开发的重要组成部分选择合适的数据库技术和编程方法对于应用的性能、可靠性和可维护性至关重要。本文介绍了Python中各种数据库的使用方法包括关系型数据库和NoSQL数据库以及ORM工具的使用。未来数据库技术的发展趋势包括云数据库越来越多的应用使用云数据库服务如AWS RDS、MongoDB Atlas等分布式数据库处理大规模数据和高并发请求边缘数据库在边缘设备上运行的轻量级数据库AI辅助数据库使用AI优化数据库性能和管理多模型数据库支持多种数据模型的混合数据库通过本文的介绍读者应该对Python数据库编程有了全面的了解能够根据具体需求选择合适的数据库技术并编写高效、安全的数据库应用。无论是开发小型应用还是大型企业系统Python都提供了丰富的工具和库来满足各种数据库需求。

相关文章:

Python数据库编程全面指南:从SQL到NoSQL

Python数据库编程全面指南:从SQL到NoSQL 1. 背景介绍 数据库是现代应用程序的核心组件之一,用于存储和管理数据。Python作为一种广泛使用的编程语言,提供了丰富的库和工具来与各种数据库进行交互。本文将全面介绍Python数据库编程&#xff0c…...

从零搭建Chiplet系统?保姆级梳理UCIe实战中的那些“坑”:Sideband流控、时钟门控与多模块链路

从零搭建Chiplet系统:UCIe实战中的关键挑战与解决方案 在半导体行业追求更高性能、更低功耗的今天,Chiplet技术已成为突破传统单芯片设计瓶颈的重要路径。作为连接不同Chiplet的"桥梁",UCIe(Universal Chiplet Interconnect Expres…...

Qt窗口管理:深入解析close与hide函数的应用场景与性能影响

1. Qt窗口管理基础:理解close与hide的核心差异 刚开始接触Qt开发时,我也曾被close()和hide()这两个看似相似的函数搞糊涂过。直到有次在项目中错误使用了close()导致整个界面崩溃,才真正意识到它们的本质区别。简单来说,hide()就像…...

如何用交换机命令行创建 VLAN(轻松秒懂)

第一步:进入配置模式刚连上交换机时,你只能看状态、不能改配置,就像只能看电视不能换台一样。只有输入这条命令,才能进入设置模式,获得修改配置的权限:system-view第二步:创建 VLAN我们以最常见…...

三步解锁Cursor Pro功能:免费体验AI编程助手完整能力

三步解锁Cursor Pro功能:免费体验AI编程助手完整能力 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tria…...

SEO检测工具有哪些_使用SEO检测工具需要注意哪些事项

SEO检测工具有哪些 在当前的互联网市场中,SEO(搜索引擎优化)是提高网站流量和品牌知名度的关键手段之一。为了帮助网站达到最佳的SEO效果,SEO检测工具应运而生。市场上有哪些可靠的SEO检测工具呢?常见的有Ahrefs、SEM…...

智能提取码工具:重新定义百度网盘资源获取效率

智能提取码工具:重新定义百度网盘资源获取效率 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字化时代,百度网盘已成为重要的资源分享平台,但提取码验证常常成为资源获取的瓶颈。智能提…...

别再乱用ref和reactive了!Vue3响应式API实战避坑指南(附代码对比)

Vue3响应式API深度解析:从原理到实战的避坑指南 在Vue3的日常开发中,ref和reactive这两个响应式API的使用频率极高,但许多开发者在使用过程中常常陷入各种"陷阱"。本文将深入剖析它们的底层机制,并通过实际案例展示如何…...

AI Agent Harness Engineering 在电商场景中的购物助手实践

AI Agent Harness Engineering 全链路实战:从0到1打造懂你的「超级电商购物助手」 1. 标题 (Title) 以下是针对本次主题的5个核心标题,覆盖了新手入门友好、技术深度拆解、业务价值落地三个不同的传播切入点: 新手入门:AI Agent Harness Engineering 全链路实战——从0到1…...

2026届最火的五大降重复率助手解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 为了达成降低文本的AIGC特征的目的,需要从词汇、句法以及结构这三个方面开展优化…...

AI 编程盛行的时代,为什么 “『DC- WFW』” 仍然具有必要性?共

这&#xff0c;是一个采用C精灵库编写的程序&#xff0c;它画了一幅漂亮的图形&#xff1a; 复制代码 #include "sprites.h" //包含C精灵库 Sprite turtle; //建立角色叫turtle void draw(int d){for(int i0;i<5;i)turtle.fd(d).left(72); } int main(){ …...

3分钟解决魔兽争霸3卡顿难题:WarcraftHelper优化工具全攻略

3分钟解决魔兽争霸3卡顿难题&#xff1a;WarcraftHelper优化工具全攻略 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 您是否也曾在重温《魔兽争霸3》…...

振动力学实战:如何用MATLAB模拟无阻尼多自由度系统的受迫振动(附完整代码)

振动力学实战&#xff1a;MATLAB频域分析全流程与工程避坑指南 当一座斜拉桥在特定风速下出现异常振动&#xff0c;或是精密仪器因环境微振动导致测量失准&#xff0c;背后往往隐藏着多自由度系统的动力学奥秘。作为机械与土木工程师&#xff0c;掌握无阻尼多自由度系统的频域分…...

元域的演进式架构:从“大而全”陷阱到“城市扩展”式敏捷构建

摘要 很多企业在构建数字化平台时&#xff0c;陷入“大而全”的陷阱&#xff1a;试图一次性设计所有功能&#xff0c;结果项目周期漫长、成本高昂、上线即落后。元域的建设同样面临这一风险。本文提出元域的演进式架构&#xff0c;以模块化、插件化、事件驱动、配置驱动四大设…...

Transformer算子实现及高阶可视化

支持&#xff1a; 输入任意源句子 / 目标句子任意 head 数任意层数任意 d_model / d_ffencoder self-attentiondecoder masked self-attentioncross-attention逐层热力图输出逐层逐帧动画输出&#xff08;GIF / MP4&#xff09; 下载脚本&#xff1a; transformer_attention_…...

微信聊天记录安全备份与全平台管理指南:从数据危机到永久保存

微信聊天记录安全备份与全平台管理指南&#xff1a;从数据危机到永久保存 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你的微信数据正面临哪些隐形风险&#xff1f; …...

机械设备出口单证操作全攻略

# 【外贸干货】机械设备出口单证操作全攻略&#xff1a;新手必看的报关、信用证、原产地证实操指南 ## 前言 做机械外贸&#xff0c;产品谈好了、合同签了&#xff0c;接下来最让新手头疼的就是单证操作。 报关单填错了&#xff0c;货物被扣&#xff1b;信用证软条款没发现&…...

C/C++ Socket网络编程 介绍

前言&#xff1a;对于C/C初学者来说&#xff0c;网络编程似乎是一道"门槛"&#xff0c;而Socket就是打开这扇门的钥匙。今天我们一起来看看如何入门Socket网络编程。 目录 一、什么是Socket 二、Socket编程流程 三、TCP Socket编程示例 四、一些注意事项 一、什么…...

FramePack深度解析:如何利用下一代帧预测技术创作高质量AI舞蹈视频

FramePack深度解析&#xff1a;如何利用下一代帧预测技术创作高质量AI舞蹈视频 【免费下载链接】FramePack Lets make video diffusion practical! 项目地址: https://gitcode.com/gh_mirrors/fr/FramePack FramePack是一款革命性的视频扩散神经网络框架&#xff0c;它通…...

leetcode 1636. 按照频率将数组升序排序-耗时100-Sort Array by Increasing Frequency

Problem: 1636. 按照频率将数组升序排序- Sort Array by Increasing Frequency 耗时100%&#xff0c;哈希表统计频次&#xff0c;然后频次和数字放入数组&#xff0c;按照题意的规则排序&#xff0c;最后得到最终的数组 Code class Solution { public:int ump[201];vector<…...

AutoGLM-Phone-9B功能体验:实测语音指令控制与图像识别

AutoGLM-Phone-9B功能体验&#xff1a;实测语音指令控制与图像识别 1. 多模态能力初体验 AutoGLM-Phone-9B作为一款专为移动端优化的多模态大模型&#xff0c;其最吸引人的特点莫过于融合了视觉、语音与文本处理能力。在实际测试中&#xff0c;我发现这款模型在资源受限设备上…...

基于CURSOR的APP自动化测试框架实战指南(一)

1. 为什么选择CURSOR搭建APP自动化测试框架 第一次接触APP自动化测试时&#xff0c;我被各种工具和框架搞得晕头转向。直到遇到CURSOR&#xff0c;才发现原来搭建测试框架可以这么简单。CURSOR最大的优势在于它把复杂的配置过程封装成了可视化操作&#xff0c;就像用积木搭房子…...

小白友好指南:在星图GPU平台无代码体验OpenClaw+Qwen3-32B

小白友好指南&#xff1a;在星图GPU平台无代码体验OpenClawQwen3-32B 1. 为什么选择云端无代码方案&#xff1f; 去年第一次接触OpenClaw时&#xff0c;我花了整整三天时间在本地环境折腾依赖项。从CUDA版本冲突到Python虚拟环境报错&#xff0c;最后连基础命令都无法执行。直…...

别再只会用OpenAI库了!用Requests库手把手教你调用硅基流动大模型API(附完整错误处理)

深入解析Requests库调用大模型API的工程化实践 在当今AI技术快速发展的背景下&#xff0c;大语言模型(LLM)已成为开发者工具箱中不可或缺的一部分。虽然OpenAI库提供了便捷的封装&#xff0c;但直接使用Requests库进行API调用能带来更大的灵活性和控制力。本文将深入探讨如何通…...

非线性悬架与UKF状态估计的Matlab/Simulink建模源码及文档资料

非线性悬架&#xff0c;UKF状态估计 软件使用&#xff1a;Matlab/Simulink 适用场景&#xff1a;采用模块化建模方法&#xff0c;搭建空气悬架模型&#xff0c;UKF状态估计模型&#xff0c;可实现悬架动挠度等状态估计。 包含&#xff1a;simulink源码文件&#xff0c;详细建模…...

一款基于 .NET 开源、跨平台应用程序自动升级组件恳

基础示例&#xff1a;单工作表 Excel 转 TXT 以下是将一个 Excel 文件中的第一个工作表转换为 TXT 的完整步骤&#xff1a; 1. 加载并读取Excel文件 from spire.xls import * from spire.xls.common import * workbook Workbook() workbook.LoadFromFile("示例.xlsx"…...

HTTP 与 HTTPS 详解:区别、工作原理、应用场景(超清晰易懂版)

HTTP 与 HTTPS 详解&#xff1a;区别、工作原理、应用场景&#xff08;超清晰易懂版&#xff09;一、HTTP 是什么&#xff1f;二、HTTPS 是什么&#xff1f;三、HTTP 与 HTTPS 最核心区别&#xff08;一张表看懂&#xff09;四、HTTP 工作原理&#xff08;极简&#xff09;五、…...

保姆级教程:彻底解决VMware vCenter证书过期问题(含certificate-manager全流程)

深度解析&#xff1a;VMware vCenter证书体系与certificate-manager全流程操作指南 当你突然无法登录vCenter管理界面&#xff0c;看到浏览器弹出"此网站的安全证书已过期"的红色警告时&#xff0c;作为运维人员的肾上腺素立刻飙升。这不是普通的登录问题&#xff0c…...

【RocketMQ】消息重试机制深度解析:从异常处理到死信队列的最佳实践

1. RocketMQ消息重试机制全景解读 第一次接触RocketMQ的重试功能时&#xff0c;我踩过一个坑&#xff1a;线上系统突然出现大量消息堆积&#xff0c;排查后发现是消费者处理异常导致消息不断重试。这个经历让我深刻认识到&#xff0c;理解消息重试机制是保障分布式系统可靠性的…...

AI图像增强实用指南:用Real-ESRGAN-GUI提升图片清晰度

AI图像增强实用指南&#xff1a;用Real-ESRGAN-GUI提升图片清晰度 【免费下载链接】Real-ESRGAN-GUI Lovely Real-ESRGAN / Real-CUGAN GUI Wrapper 项目地址: https://gitcode.com/gh_mirrors/re/Real-ESRGAN-GUI 在数字时代&#xff0c;我们经常遇到低分辨率、模糊的图…...