C#连接PostgreSQL:Npgsql驱动原理与生产实践
1. 项目概述为什么选Npgsql而不是ADO.NET原生驱动“C#连接数据库PostSQL-NpgSQL”这个标题看似简单但背后藏着一个在.NET生态里被反复验证过、却常被新手忽略的关键决策点PostgreSQL不是SQL Server硬套微软全家桶方案会踩坑。我带过不少刚从ASP.NET Web Forms转过来的开发者第一反应就是翻出System.Data.SqlClient——结果连引用都加不上报错提示“无法加载类型‘SqlConnection’”当场懵住。其实问题不在代码而在认知偏差PostgreSQL是完全独立于微软技术栈的开源关系型数据库它不认SqlClient也不吃SqlServer那一套连接字符串语法。这时候Npgsql就不是“一个可选项”而是唯一合规、稳定、持续更新的官方级.NET PostgreSQL驱动。Npgsql这个名字里的“pg”就是PostgreSQL的缩写“N”代表.NET直白说就是“为.NET量身定制的PostgreSQL协议实现”。它不是简单的封装层而是从零开始用C#重写的PostgreSQL前端协议客户端完整实现了SSL加密握手、流式查询、异步I/O、连接池管理、类型映射比如把PostgreSQL的jsonb精准转成JObject把citext映射为大小写不敏感字符串甚至支持COPY命令的高速批量导入导出。我去年帮某高校实验室重构一个地理信息分析系统时把原来用ODBC桥接手动字符串拼接的旧方案换成Npgsql后单次空间查询耗时从2.3秒压到0.4秒关键就在于Npgsql原生支持PostGIS的WKB/WKT二进制协议不用经过文本解析中转。你可能会问那Entity Framework Core呢它底层不也用Npgsql吗没错但EF Core是ORM抽象层而Npgsql是底层通信引擎。就像汽车的发动机和车载导航系统——导航能帮你规划路线但真正让车跑起来的是发动机。当你需要执行复杂CTE递归查询、调用自定义聚合函数、处理大对象LOB流式读写或者调试连接超时到底是网络问题还是服务端拒绝你就必须直面Npgsql的API。这也是为什么标题里明确写了“C#连接数据库”而不是“用EF Core操作PostgreSQL”——它强调的是最基础、最可控、最贴近数据库本质的连接能力。这个项目适合三类人一是正在搭建新系统的.NET后端开发者需要从零设计数据访问层二是维护老项目的工程师发现现有ODBC或第三方驱动频繁报Invalid operation on closed connection三是学习数据库原理的学生想通过真实协议交互理解“连接池怎么复用socket”“参数化查询如何防SQL注入”。它不教你怎么写CRUD页面但教会你当connection.Open()返回那一刻背后发生了多少次TCP握手、SSL协商、认证挑战响应。这才是标题里那个“连接”二字的真正分量。2. 核心技术拆解Npgsql协议栈与.NET运行时的深度协同2.1 协议层PostgreSQL的StartupMessage如何被Npgsql翻译成C#对象PostgreSQL客户端连接的第一步不是发SQL而是发送一个名为StartupMessage的二进制包里面包含协议版本号目前主流是3.0、数据库名、用户名、客户端编码等元信息。Npgsql没有用反射或JSON序列化来构造这个包而是直接操作Spanbyte进行内存写入——这是.NET Core 2.1引入的高性能原语避免了传统byte[]数组的堆分配开销。我反编译过Npgsql 7.0的源码在NpgsqlConnector.StartUserAction方法里能看到这样的逻辑var buffer _writeBuffer.GetSpan(16); // 直接从预分配缓冲区取16字节 buffer[0] (byte)p; // 消息类型标识符 BitConverter.TryWriteBytes(buffer.Slice(1, 4), 196608); // 写入协议版本3.00x00030000 // 后续依次写入数据库名长度、字符串内容、用户名长度、字符串内容...这种写法比MemoryStream.Write()快3倍以上尤其在高并发短连接场景下比如API网关每秒处理5000连接请求。如果你用Wireshark抓包看Npgsql建立连接的过程会发现它发出的第一个TCP数据包只有不到100字节而ODBC驱动往往要发300字节——多出来的全是冗余的空格和换行符。这就是协议实现精度的差距。2.2 连接池机制为什么设置Maximum Pool Size100反而导致连接耗尽Npgsql的连接池不是简单的对象缓存队列而是一个带状态机的资源调度器。每个连接对象NpgsqlConnection在Close()后并不会立即销毁而是进入Poolable状态等待被Open()复用。但这里有个致命陷阱连接池大小限制作用于“已创建但未释放”的连接数而非“当前活跃连接数”。举个真实案例某电商后台用Dapper NpgSql做订单查询设置了Maximum Pool Size100但高峰期出现大量Timeout expired异常。排查发现所有请求都在等连接而数据库服务器实际只看到20个活跃会话。原因在于——连接池里塞满了处于Idle状态但尚未被GC回收的连接而新请求又不断创建新连接尝试加入池子直到达到100上限后全部排队。根本解法不是调大池子而是控制连接生命周期。Npgsql要求你严格遵守“using语句包裹连接”的铁律// ✅ 正确using确保Dispose被调用连接立刻归还池子 using var conn new NpgsqlConnection(connString); conn.Open(); // 执行查询... // ❌ 错误没有using连接可能因异常未关闭长期占用池子 var conn new NpgsqlConnection(connString); conn.Open(); // 如果这里抛异常且没try-catchconn.Dispose()永远不会执行更进一步Npgsql 6.0后引入了Connection Idle Lifetime参数默认10分钟超过该时间的空闲连接会被主动清理。我在生产环境通常设为60秒配合Kubernetes的liveness probe每30秒检查一次确保连接池不会积累僵尸连接。2.3 类型映射从PostgreSQL的tsvector到C#的ReadOnlyMemorycharPostgreSQL全文检索的tsvector类型在Npgsql里被映射为ReadOnlyMemorychar而非string这背后有深刻考量。tsvector在服务端存储为二进制格式如cat:1A dog:2B如果转成string再解析会触发两次内存拷贝第一次从socket缓冲区复制到托管堆第二次从string复制到char[]数组。而ReadOnlyMemorychar直接指向原始缓冲区的某段内存视图零拷贝。我测试过对10MB的tsvector字段做高亮处理用ReadOnlyMemorychar方案CPU占用率比string方案低67%。但这也带来使用门槛你不能直接Console.WriteLine(tsvector)因为ReadOnlyMemorychar没有重载ToString()。正确姿势是用TextReader包装using var reader new StringReader(tsvector.ToString()); // 注意这里ToString()是安全的它只是生成临时string供调试 // 或者用Spanchar做原地解析 var span tsvector.Span; if (span.Length 0 span[0] \) { // 解析词干和位置信息... }这种设计体现了Npgsql的核心哲学性能优先但把复杂性暴露给开发者而不是用便利性掩盖真相。3. 实操全流程从零配置到生产级连接管理3.1 环境准备与依赖安装为什么NuGet包要选Npgsql而非Npgsql.EntityFrameworkCore.PostgreSQL第一步永远是添加NuGet包。这里有个关键选择你应该安装Npgsql纯驱动包而不是Npgsql.EntityFrameworkCore.PostgreSQLEF Core提供程序。后者虽然方便但它把Npgsql作为内部依赖隐藏起来导致你无法精细控制底层行为。比如你想启用TCP KeepAlive防止云环境连接被中间设备断开就必须直接引用Npgsql并配置Keepalive30参数——EF Core提供程序根本不暴露这个开关。安装命令很简单dotnet add package Npgsql --version 8.0.2注意版本号。Npgsql 8.x要求.NET 6如果你还在用.NET Framework 4.8必须降级到Npgsql 6.0.8最后支持.NET Framework的版本。我见过太多团队因为版本错配在CI/CD流水线里卡在Could not load file or assembly Npgsql, Version8.0.0.0上一整天。3.2 连接字符串构建从明文密码到连接参数的逐项解析一个典型的Npgsql连接字符串长这样Hostmyserver;Port5432;Databasemydb;Usernamemyuser;Passwordmypass;SSL ModeRequire;Trust Server Certificatetrue;Connection Timeout30;Maximum Pool Size50;Min Pool Size5;Keepalive30;我们逐项拆解其生产意义Host和Port不要写localhost而要用具体IP或DNS名。localhost在Linux容器里会走Unix socket而Docker默认禁用该功能导致连接失败。SSL ModeRequire强制加密但Trust Server Certificatetrue仅用于测试环境。生产必须用SSL ModeVerifyFull并配置Root Certificate路径否则中间人攻击风险极高。Connection Timeout30这个30秒不是“SQL执行超时”而是“从调用Open()到收到服务端欢迎包的最大等待时间”。如果数据库负载高建议设为15避免请求堆积。Maximum Pool Size50根据你的应用QPS和平均查询耗时计算。公式是池大小 ≈ QPS × 平均查询耗时秒× 1.5。比如QPS100平均耗时0.2秒则100×0.2×1.530设50留有余量。Keepalive30开启TCP保活每30秒发一个心跳包。在AWS ALB或阿里云SLB后端这是防止连接被负载均衡器静默断开的必备参数。提示连接字符串中的密码绝不能硬编码必须用.NET的IConfiguration从环境变量或Azure Key Vault读取。我习惯在appsettings.json里这样写ConnectionStrings: { PostgreSql: Host{host};Port{port};Database{db};Username{user};Password{password};SSL ModeVerifyFull; }然后用ConfigurationBinder替换占位符密码从Environment.GetEnvironmentVariable(PG_PASSWORD)获取。3.3 基础连接与查询同步vs异步的性能实测对比写一个最简连接示例重点看异步模式的价值// 同步方式仅用于演示生产禁用 var conn new NpgsqlConnection(connString); conn.Open(); using var cmd new NpgsqlCommand(SELECT COUNT(*) FROM users, conn); var count (long)cmd.ExecuteScalar(); conn.Close(); // 异步方式生产唯一选择 await using var conn new NpgsqlConnection(connString); await conn.OpenAsync(); await using var cmd new NpgsqlCommand(SELECT COUNT(*) FROM users, conn); var count (long)await cmd.ExecuteScalarAsync();关键差异在await using和OpenAsync()。我用Apache Bench对同一API压测1000并发同步模式下平均响应时间120ms错误率8.3%异步模式下平均响应时间45ms错误率0%。原因在于同步Open()会阻塞线程池线程而.NET线程池默认只有1000个线程一旦耗尽后续请求只能排队等待。异步则把等待IO的时间交还给操作系统线程可以去处理其他请求。注意ExecuteScalarAsync()返回的是Taskobject必须await不能.Result或.Wait()否则会死锁。这是.NET异步编程的铁律。3.4 连接池监控如何用Npgsql自带的统计API诊断瓶颈Npgsql内置了连接池状态监控无需额外工具。在应用启动时注册一个健康检查端点app.MapGet(/health/db, async (HttpContext ctx) { var poolStats NpgsqlConnection.GlobalTypeMapper; // 实际获取池状态需反射但Npgsql 8.0提供了公开API var stats await NpgsqlDataSource.Create(connString).GetStatisticsAsync(); var response new { TotalConnections stats.TotalConnections, IdleConnections stats.IdleConnections, BusyConnections stats.BusyConnections, FailedAcquires stats.FailedAcquires, AverageAcquireTimeMs stats.AverageAcquireTime.TotalMilliseconds }; await JsonSerializer.SerializeAsync(ctx.Response.Body, response); });这个端点返回的FailedAcquires值如果持续大于0说明连接池严重不足AverageAcquireTimeMs超过10ms说明连接获取有延迟可能是网络抖动或数据库负载过高。我曾在某次数据库主从切换后通过这个指标在3分钟内定位到从库同步延迟导致连接池饥饿比等告警邮件快得多。4. 高阶实战应对真实世界的复杂场景4.1 处理PostgreSQL的特殊类型jsonb、hstore、ltree的C#映射PostgreSQL的jsonb不是简单字符串而是二进制JSON支持索引和高效查询。Npgsql默认把它映射为JObject来自Newtonsoft.Json但如果你用System.Text.Json就得注册自定义类型处理器// 全局注册应用启动时执行一次 NpgsqlConnection.GlobalTypeMapper .AddMapping(new NpgsqlTypeMappingBuilder { PgTypeName jsonb, ClrTypes new[] { typeof(JsonDocument), typeof(JsonElement) }, ValueReader new JsonbValueReader(), ValueWriter new JsonbValueWriter() }.Build());其中JsonbValueReader要实现INpgsqlSimpleValueReaderJsonDocument接口核心逻辑是调用NpgsqlReadBuffer.ReadBytes()读取二进制流再用JsonDocument.Parse()解析。这个过程比JObject.Parse()快40%因为跳过了字符串转换环节。hstore键值对类型则映射为Dictionarystring, string但要注意PostgreSQL的hstore允许键重复而C#字典不允许。所以Npgsql做了妥协——只保留最后一个同名键的值。如果你的应用逻辑依赖重复键必须改用ListKeyValuePairstring, string并手动解析。ltree树状路径类型最棘手。它存储如Top.Science.Physics这样的路径Npgsql默认映射为string但这样就失去了路径运算能力如表示“是否为子路径”。正确做法是创建一个LTree结构体public readonly struct LTree : IEquatableLTree { public readonly string Path; public LTree(string path) Path path ?? throw new ArgumentNullException(nameof(path)); public static implicit operator string(LTree ltree) ltree.Path; public static implicit operator LTree(string path) new LTree(path); }然后注册映射让Npgsql知道ltree类型对应这个结构体。这样你就能在查询中直接写cmd.Parameters.AddWithValue(path, new LTree(Top.Science)); cmd.CommandText SELECT * FROM categories WHERE path path;4.2 连接故障转移当主库宕机时如何秒级切换到备用库Npgsql原生支持连接字符串里的多个主机用逗号分隔Hostprimary,standby1,standby2;Port5432;Databasemydb;...;Target Session Attributesread-write;但光这样不够。Target Session Attributesread-write告诉Npgsql只连接能执行写操作的节点。PostgreSQL流复制中备库默认是只读的所以Npgsql会自动跳过它们直连主库。当主库宕机Npgsql会在下次连接时尝试下一个主机并检测其只读状态。我实测过在主库kill -9后首次连接失败到成功连上备库已提升为主的耗时是1.2秒完全满足金融级应用的RTO要求。更进一步你可以用NpgsqlDataSource实现智能路由var dataSource new NpgsqlDataSourceBuilder(connString) .AddDataSourceProxy(new FailoverDataSourceProxy()) // 自定义代理 .Build(); // FailoverDataSourceProxy里重写OpenNewConnectionAsync先ping主库失败则切备库4.3 性能调优批量插入10万行数据的三种方案实测向PostgreSQL插入大量数据别用循环INSERT INTO。我对比了三种方案硬件i7-10875H, 32GB RAM, NVMe SSD方案代码特征10万行耗时CPU占用内存峰值循环Insertfor i in 1..100000: cmd.ExecuteNonQuery()42.3秒92%1.2GBNpgsqlBatchbatch.BatchCommands.Add(cmd); batch.Execute()8.7秒45%320MBCOPY命令await using var writer conn.BeginTextImport(COPY users FROM STDIN); writer.WriteLine(...)1.9秒28%85MBCOPY方案最快因为它绕过SQL解析直接把数据流式写入表文件。但要注意COPY不走事务日志如果中途失败数据可能部分写入。所以生产环境我推荐NpgsqlBatch——它在单个网络往返中发送多条命令服务端原子执行且支持事务回滚。NpgsqlBatch的正确用法await using var conn new NpgsqlConnection(connString); await conn.OpenAsync(); await using var batch conn.CreateBatch(); for (int i 0; i 100000; i) { var cmd new NpgsqlBatchCommand(INSERT INTO users (name, email) VALUES (name, email)); cmd.Parameters.AddWithValue(name, $user{i}); cmd.Parameters.AddWithValue(email, $u{i}example.com); batch.BatchCommands.Add(cmd); } await batch.ExecuteNonQueryAsync();5. 常见问题与避坑指南那些文档里不会写的血泪教训5.1 经典报错解析Npgsql.PostgresException: 23505: duplicate key value violates unique constraint这个错误码23505表示唯一约束冲突但新手常误以为是代码逻辑问题。实际上90%的情况是连接池里的连接复用了上一个事务的隔离级别或搜索路径。比如前一个请求执行了SET search_path TO tenant_a然后Close()连接归还池子。下一个请求拿到这个连接没重置search_path结果查到了错误schema下的表。解决方案在连接字符串里加No Reset On Closetrue并显式重置await conn.OpenAsync(); await using var cmd new NpgsqlCommand(RESET ALL, conn); await cmd.ExecuteNonQueryAsync(); // 重置所有会话变量5.2 字符编码陷阱为什么中文存进数据库变成?????PostgreSQL默认编码是UTF8但Npgsql连接时会读取服务端client_encoding参数。如果服务端被误设为LATIN1Npgsql就会按LATIN1解码字节流导致中文乱码。检查方法SHOW client_encoding; -- 应该返回 utf8修复命令ALTER DATABASE mydb SET client_encoding TO utf8;5.3 Docker部署必踩坑Npgsql.NpgsqlException: Exception while reading from stream在Docker容器里连宿主机PostgreSQL很多人写Hostlocalhost结果失败。因为容器内的localhost指向自己不是宿主机。正确写法是LinuxHosthost.docker.internalmacOS/WindowsHostdocker.for.mac.host.internal新版Docker Desktop统一为host.docker.internal或者更通用的方案在docker run时加--add-hosthost.docker.internal:host-gateway。5.4 生产环境监控清单上线前必须验证的7个检查项我把每次上线前的检查项整理成表格避免遗漏检查项验证方法不通过后果我的实操备注SSL证书有效性openssl s_client -connect mydb:5432 -servername mydb中间人攻击风险生产必须用VerifyFull测试可用Require连接池大小匹配QPSab -n 1000 -c 100 http://api/health/db请求排队超时按QPS×平均耗时×1.5计算宁大勿小Keepalive参数生效ss -tnp | grep :5432查看timer:(keepalive,30sec,0)负载均衡器断连Kubernetes需同时设livenessProbe.initialDelaySeconds30时区一致性SELECT NOW(), current_setting(timezone);对比应用服务器时区时间字段错乱应用启动时执行SET TIME ZONE Asia/Shanghaijsonb字段索引存在\d users查看jsonb_path_ops索引JSON查询慢10倍对>

相关新闻

数学物理方程详解:PDE分类与三大经典方程推导

数学物理方程详解:PDE分类与三大经典方程推导

简介:《中科大数理方程》PPT课件面向高校数学、物理及相关工科专业学生,适合课程学习、考研复习和教师备课。课件系统讲解偏微分方程(PDE)核心知识:先阐明基本概念与阶数定义,再区分线性与非线性、常系数与…

2026/10/15 13:30:01 阅读更多 →
XSS攻击深度解析与防御实战指南

XSS攻击深度解析与防御实战指南

1. XSS攻击的本质与危害解析跨站脚本攻击(XSS)作为OWASP Top 10常驻成员,本质上是一种将恶意脚本注入到可信网站中的攻击手段。攻击者利用网站对用户输入过滤不严的漏洞,在受害者浏览器中执行非预期的JavaScript代码。不同于其他W…

2026/10/15 13:29:01 阅读更多 →
用技能包重组命令行工作流:ponytail 插件框架实战指南

用技能包重组命令行工作流:ponytail 插件框架实战指南

半月前我把工作流里最常用的一批脚本全扔进了同一个工具,每天敲的命令从十几条变成一两条。这个工具叫 ponytail,本质上是一个命令行插件框架,核心概念是"技能包"(skill):把一个完整的工作流程固…

2026/10/15 13:29:01 阅读更多 →

最新新闻

Windows 10 1803安全基线:本地化终端合规落地实践

Windows 10 1803安全基线:本地化终端合规落地实践

简介:本资源是面向企业IT管理员、安全合规工程师及Windows系统运维人员的Windows 10 Version 1803(RS4)安全基线实施套件,用于快速落地等保2.0、ISO 27001等合规要求中的终端安全配置。压缩包含72个文件,总计1.06MB&am…

2026/10/15 14:56:39 阅读更多 →
C语言迷宫求解课程设计:DFS/BFS/A*算法实现与终端可视化

C语言迷宫求解课程设计:DFS/BFS/A*算法实现与终端可视化

简介:本资源是一份面向计算机专业本科生的C语言与数据结构综合课程设计实践项目,聚焦迷宫路径求解与交互式游戏开发,适用于算法实现、链表/栈/队列应用及图形化控制等核心知识点训练。压缩包共5个文件(3个txt迷宫配置文件、1个cpp…

2026/10/15 14:56:39 阅读更多 →
Ceph OSD启动失败的四层校验机制深度解析

Ceph OSD启动失败的四层校验机制深度解析

简介:本资源为Ceph分布式存储系统的中文技术文档合集,面向Linux系统运维工程师、云平台架构师及存储方向开发者,解决Ceph集群部署、配置调优与日常管理中的核心知识缺口。文档覆盖对象存储(RGW)、块设备(RB…

2026/10/15 14:56:39 阅读更多 →
视频加密与转码协同方案:AES-CBC+CENC分片加密实践

视频加密与转码协同方案:AES-CBC+CENC分片加密实践

简介:这是一套基于C#开发的视频文件加密与转码一体化解决方案,面向多媒体安全开发人员及音视频应用开发者,解决商业视频内容防盗播、本地化安全分发等核心需求。程序采用AES算法对视频文件进行全量加密,结合内置微型Web服务器实现…

2026/10/15 14:56:39 阅读更多 →
三页静态网页设计源码实战:HTML+CSS实现文字、图片与超链接跳转

三页静态网页设计源码实战:HTML+CSS实现文字、图片与超链接跳转

简介:这份网页设计资源面向刚接触前端、需要完成课程作业或入门练习的学习者,围绕“三个页面”这一典型场景,讲解如何用HTML搭建文字、图片与超链接内容,并借助CSS完成基本美化,解决页面结构组织与页面间跳转的入门问题…

2026/10/15 14:56:39 阅读更多 →
CD44重组蛋白是肿瘤干细胞标志物研究与靶向药物开发的重要工具

CD44重组蛋白是肿瘤干细胞标志物研究与靶向药物开发的重要工具

简述: CD44又称HCAM、PGP‑1、ECMR‑III,是位于人类11号染色体的跨膜糖蛋白,也是透明质酸、骨桥蛋白等多种配体的受体。CD44参与细胞黏附、迁移、淋巴细胞归巢、上皮‑间质转化、肿瘤干细胞维持及转移调控,其标准型与变异体在不同…

2026/10/15 14:55:37 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →