尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
AI代理批量创建PostgreSQL数据库的自动化实践与避坑指南
这几天技术社区里讨论最热闹的一个话题是“AI代理批量创建数据库”。3月19日的 PostgreSQL 技术日报我本来只想按惯例整理点版本动态和社区新闻结果发现大家真正在传的、在争论的根本不是某个补丁而是 AI 代理开始把 CREATE DATABASE 当成日常操作了。一条提示词下去几十个数据库自动落盘角色、权限、连接限额全部配好整个过程用不了几分钟。这个变化看上去很酷但真正经历过的人都知道建库从来不是“执行一句 SQL”那么简单背后是一整套流程、权限和容量管理的问题。这篇日报我干脆把“AI 代理批量创建 PostgreSQL 数据库”这件事完整拆一遍从技术链路讲到参数设计再到安全红线和实际踩坑想搞数据库自动化的人可以认真参考。1. 先看清楚AI代理批量建库解决的是流程问题不是SQL问题1.1 传统建库流程为什么慢很多人第一次听到“AI批量建库”时第一反应是“CREATE DATABASE 不是很简单吗一条语句就完了”觉得没必要专门拿 AI 来做。但如果你真的在团队里负责过 PostgreSQL 实例管理会有完全不同的体感。单条建库语句确实轻量通常一两秒就能跑完。真正的瓶颈在于建库前后的 4 个决策环节第一库名和命名规范。库名不能乱起得符合团队约定一般要求小写、以下划线分隔、带业务前缀而且要去重、防冲突。这个判断过去是靠人来记的。第二owner 和权限归属。新库要归哪个角色管是该库专属 owner 还是共用服务账号哪些人需要连接权限哪些人只能只读这需要结合业务实际情况来定。第三模板和参数。PostgreSQL 建库时要指定 TEMPLATE、ENCODING、LC_COLLATE、LC_CTYPE、CONNECTION LIMIT 等选项不同场景组合不一样。开发库、测试库、生产库的参数完全不能混用。第四容量与团队配额。一个实例的 max_connections 是固定的磁盘空间是共享的库不能无限建。谁申请、建多大、什么时候回收必须有一个台账。传统流程里这四件事全靠 DBA 或运维人工处理。开发者提一个“帮我建个库”的工单DBA 先看命名是否合规再确认 owner再挑参数再估计资源余量然后才执行。整个过程少则几十分钟多则一两天遇到排队更久。批量场景下就更夸张比如一次性要为 30 个新租户各建一个库纯手工操作很容易出错——库名打错一个字母、连接限制忘写、owner 配错都是常见事故。1.2 AI代理改变了什么AI 代理介入之后建库从“提工单等人处理”变成了“自然语言描述AI 自动执行”。用户对代理说“给 A 项目创建 12 个开发数据库命名规则是 a_project_dev_01 到 12owner 统一用 service_a”代理会自主完成库名生成、重复性检查、参数补齐、执行创建、结果汇总这一整套动作。这个过程看起来只是把人工操作换成了程序执行但它的本质变化在于建库能力从“少数 DBA 掌握的专业技能”变成了“所有人通过对话就能触发的自助服务”。效率提升非常明显几分钟能完成过去几天的活同时它也把数据库管理的风险面放大了——如果 AI 代理的权限过大、参数判断有误、操作不受审计批量创建就可能演变成批量事故。所以AI 代理批量建库真正解决的是流程效率和标准化的问题而不是 SQL 语句怎么写的问题。理解了这一点后面的技术拆解才有意义。2. 拆解AI代理“指挥”PostgreSQL建库的技术链路2.1 意图到参数模型不执行SQL只整理决策AI 代理批量建库很多人误以为是大模型直接生成 SQL 然后丢给 PostgreSQL 执行。实际上正规的做法要分层大模型负责“理解意图”和“整理参数”真正执行数据库操作的是一套受控的代码逻辑。举例来说用户说“为项目 X 建 5 个测试库要能连、要限制连接数”大模型需要做的是从这句话里抽取关键参数项目标识 X、数量 5、用途 test、需要连接权限、需要连接限制根据内置的规范把库名标准化比如生成 x_test_01 到 x_test_05选择合适的模板库编码和排序规则补齐 owner、tablespace、连接数量等默认参数最终把参数整理成一个结构化的工具调用请求交给执行层。这就是业界常见的 Function Calling 模型或者通过 MCPModel Context Protocol这类工具协议来组织。大模型本身不持有数据库账密也不需要直连 PostgreSQL。它只负责“做决策”把决策结果以 JSON 形式输出再由中间层校验参数合法性和权限最后才真正执行 CREATE DATABASE。这么做有一个非常现实的原因大模型的输出有概率性同一个问题它可能给出不同答案。如果不加校验就直接执行某个参数写错了就是生产事故。中间加一道结构化校验相当于在 AI 的“嘴巴”和数据库的“耳朵”之间装了一个过滤器。2.2 执行通道工具调用与受控中间层执行通道是整个链路里最值得设计的地方。我在实际搭建演示环境时采用的方案是“AI 代理 中间管理服务 PostgreSQL 实例”三层结构。AI 代理负责对话和意图解析输出的是标准化动作请求。中间管理服务是一个很薄的应用程序它可以是一段 Python 脚本也可以是一个平台接口专门做三件事校验参数、执行操作、返回结果。PostgreSQL 实例只对中间管理服务开放连接不直接暴露给 AI 代理。用这层中间服务可以方便地加很多保护逻辑。比如检查库名是否重复、检查当前实例数据库总数是否超过配额、检查请求者是否有申请权限、设置单次批量上限、记录完整的操作日志。这些逻辑如果放在 AI 代理侧是不可靠的因为模型输出不稳定放在中间服务的代码里才是确定性行为。打个比方AI 代理像一个前台接待员它帮你填表单、递材料但最终拍板盖章的是后台主管。主管认规则不认人情参数不对就驳回申请超限就拒绝。这个“后台主管”就是中间管理服务也是 AI 批量建库能不能安全落地的关键。3. 批量创建数据库的完整实操流程与参数设计3.1 前置准备建好自动化角色和模板库真正动手之前先把前置条件准备好。我不会让 AI 代理使用 postgres 超级用户去建库这是安全底线。需要准备的东西有三个。第一专门的操作角色。在目标实例上创建一个名为 automation_role 的角色仅授予 CREATEDB 属性不授予 SUPERUSER。可以参考下面的 SQLCREATE ROLE automation_role LOGIN CREATEDB PASSWORD 这里写强密码;注意如果以后还想让这个角色管理连接限制或回收数据库可能还需要给它相应权限。但原则是只给完成建库任务的最小权限。不要顺手给 SUPERUSER也不要给它访问其他业务数据的权限。这样即使 AI 代理参数出现严重错误影响范围也被限制在“建库”这个动作本身不会波及其他数据。第二确认模板库。PostgreSQL 实例默认有 template0、template1、template_postgis 等模板库。业务建库通常基于 template1因为它包含你为整个实例配置的默认扩展和编码策略。需要特别记住建库时的 ENCODING、LC_COLLATE、LC_CTYPE 在库创建后基本不可改所以模板必须提前确认。可以在建库参数里显式指定编码也可以直接依赖模板的默认值。第三准备好常用参数清单。建议在中间服务里维护一个配置表包含默认字符集通常 UTF8、默认排序规则locale中文环境一般选 zh_CN.UTF-8 或 C.UTF-8具体看发行版和标准化要求、默认连接数限制、默认 tablespace。这样 AI 代理补齐参数时就有据可依不会每次生成不一样的配置。3.2 执行细节幂等判断与批量节奏控制批量建库最容易踩的坑是重复执行。如果 AI 代理第一次执行到一半网络超时客户重试中间服务会不会重复建库PostgreSQL 的 CREATE DATABASE 语句不支持 IF NOT EXISTS 语法所以幂等逻辑要自己写。标准做法是执行前先查 pg_databaseSELECT datname FROM pg_database WHERE datname 目标库名;如果存在就跳过创建直接返回“已存在”如果不存在再执行 CREATE DATABASE。但这里还有一个并发问题如果两个请求同时检查到库不存在然后同时执行创建后执行的那个会报“database already exists”错误。所以中间服务最好对“创建同名数据库”的操作加分布式锁或者用类似 PostgreSQL 的 advisory lock 来串行化SELECT pg_advisory_lock(哈希值); -- 执行建库 SELECT pg_advisory_unlock(哈希值);在展示批量建库逻辑时我写过一段类似下面的伪代码核心思路就是“先查再建、失败跳过、整体记录”for db_name in db_names: if db_exists(db_name): results.append({name: db_name, status: skipped}) continue try: execute(fCREATE DATABASE {db_name} OWNER service_a ENCODING UTF8 CONNECTION LIMIT 50) results.append({name: db_name, status: created}) except Exception as exc: results.append({name: db_name, status: failed, reason: str(exc)})批量节奏也要控制。不要一次性并发提交 100 条 CREATE DATABASE因为 PostgreSQL 的建库操作会获取系统目录上的排他锁并发量过大反而互相阻塞甚至拖垮整个实例。我个人经验是批量建库采用串行或多批次比如每次 5 到 10 个的方式每个库建完确认成功后再继续下一批。这样整体耗时可能多几秒但是稳定得多。3.3 容量规划连接数、磁盘与配额怎么定批量建库时必须提前规划连接数。PostgreSQL 的 max_connections 决定了整个实例能接受的最大连接数它是全局资源而不是每库独立资源。如果一个实例 max_connections 是 500你给每个库都设置 CONNECTION LIMIT 200那 3 个库就可能把全局连接吃光。正确的思路是先明确实例总量再给每个库分配合适的连接上限。比如实例 max_connections 为 500预留 100 给超级用户和运维通道剩下 400 分给业务库每个库限制 50最多支撑 8 个活跃业务库。超过这个数量要么扩容实例要么引入连接池中间件比如 PgBouncer把前端海量连接收敛到后端少量连接。磁盘容量同样要提前算。批量创建几十个库初始数据量可能不大但每个库后面都会产生 WAL 日志、临时文件、索引数据。不要等磁盘满了才处理建议为每个数据库设置默认 tablespace把不同业务线拆到不同磁盘同时建立容量监控库总大小超过阈值就告警。建库时一般不会直接限定某个库的磁盘上限——PostgreSQL 自身没有单库磁盘配额的功能所以要靠外部手段比如操作系统级磁盘配额或者定期巡检清理来兜底。还有一个经常被忽略的配额维度实例上的库总数。一台 PostgreSQL 实例上的数据库数量不能无限膨胀一方面系统目录会变大另一方面备份和恢复时间会增加日常管理也会变得混乱。所以我在中间服务里配置了一个“实例最大库数量”参数超过就拒绝新申请。这是 AI 代理批量建库场景下的重要熔断机制。3.4 生命周期命名规则与自动回收批量建库容易导致“库海”泛滥用完不回收最后满实例都是僵尸库。所以命名规则和自动回收机制必须一次性设计好。命名规则方面我的建议是全部小写用下划线分隔带清晰的业务前缀和用途后缀。例如 order_service_test_03、data_platform_dev_20250319。禁止出现大写字母、连字符、点号因为 PostgreSQL 里未加引号的库名会自动转成小写而连字符会被当作减号处理如果库名里有大写或连字符每次引用都不得不加双引号后续所有脚本、连接串、工具都会跟着遭殃。中间服务要做一层强校验凡是命名不合规的请求无论 AI 代理怎么说一律拒绝。自动回收机制方面核心是给每个库打上“生命周期标签”。比如开发测试库默认 TTL 为 24 小时到期后由定时任务自动 DROP DATABASE。实现上可以维护一张元数据表记录每个库的创建时间、用途、过期时间、申请人然后每小时扫描一次SELECT datname FROM pg_database WHERE datname IN (SELECT db_name FROM 元数据表 WHERE expire_time now());扫描到过期库之后依次 DROP DATABASE。注意 DROP DATABASE 也必须在没有活动连接的情况下才能成功所以回收脚本要先用 pg_terminate_backend 清理连接再执行 DROP。这个细节很关键否则很多库会提示“database is being accessed by other users”而删不掉。4. 两个典型场景多租户隔离和测试环境供给4.1 多租户SaaS一租户一库还是共享库加SchemaAI 代理批量建库最常见的应用场景之一是 SaaS 系统的多租户环境。每签一个新租户就需要一套独立的数据存储。这时候面临经典架构选择每个租户一个独立 PostgreSQL 数据库还是所有租户共享一个库、用 Schema 做隔离。一租户一库的优势是隔离彻底备份和恢复粒度清晰一个租户出现性能问题不容易影响别人。缺点是实例资源消耗大数据库数量多管理复杂。AI 代理批量建库正好能缓解“管理复杂”这个痛点申请、创建、初始化、回收全自动化人工成本被大大压缩。共享库加 Schema 的架构则更节省资源一个库能承载几百个租户但隔离性较弱一个租户的慢查询可能拖累全局。实际选型时通常需要考虑数据体量和合规要求。如果租户是几十家大型企业我更倾向一租户一库如果租户是成千上万的小终端用户共享库加 RLSRow Level Security会是更务实的选择。在采用一租户一库时AI 代理建的不仅仅是一个空库还包括初始化脚本创建租户专用角色、设置搜索路径、建立基础表结构、运行迁移脚本。这些动作本质上也是“建库”流程的一部分中间层应该支持在一个批次里完成。4.2 开发测试环境分钟级交付与自动销毁另一个最常见的场景是开发测试环境。我以前帮团队搭演示平台时遇到的痛点非常典型每次迭代要起一批新功能分支环境每个环境都要一个数据库。手动建 10 个库可能要一个上午等建完开发效率已经被拖垮。用 AI 代理 中间服务之后整个流程变成开发者在对话框里输入“创建 test 分支库分支号 1042”代理自动完成命名、建库、初始化、授权并把连接串返回给开发者。整个过程不超过 3 分钟还是无人值守的。测试环境的关键不是“建得快”而是“清得干净”。所以我特别强调 TTL 回收机制在这个场景的落地测试库默认 24 小时后可回收遇到周末自动延期。为了不误删还在用的库回收执行前会检查最近查询时间比如pg_stat_activity里近 2 小时有没有活动连接如果有就顺延下一轮再回收。这套机制上线后我的实例上僵尸库数量下降了 90% 以上。5. 安全与审计给AI代理的建库权限戴上笼头5.1 最小权限模型怎么落前面提到不要用超级用户跑 AI 代理这里展开讲一下权限模型如何设计。理想情况下AI 代理对应的数据库角色应该满足以下几个条件必须具备 CREATEDB 属性否则连建库入口都没有不具备 SUPERUSER不能绕开权限检查不是任何业务数据的 owner避免操作业务表只能通过中间管理服务连接限制 source IP 或者连接地址。在这个基础上每个新建的库要指定独立的业务 owner而不是让自动化角色当 owner。例如建库时带上OWNER service_a之后自动化角色对 service_a 的库没有数据访问权除非显式授权。这样即使自动化角色的凭证泄露损失也被控制在一系列空数据库上不会波及真实业务数据。另外一个操作细节使用 CREATEDB 角色建库时这个角色默认就是新库的 owner 吗是的如果没有指定 OWNER 的话。所以我们一定要在 CREATE DATABASE 语句里显式写 OWNER把新库的所有权交给业务角色。中间服务可以维护一张“角色映射表”按业务线自动选择合适的 owner。5.2 审计留痕与异常熔断AI 代理批量建库之后审计日志比人工作业更重要。因为人工建库时DBA 知道自己做了什么而 AI 代理可能在一个小时内执行了几十次操作如果不留痕出问题后根本无法回溯。我的建议是至少记录四类信息请求信息谁在什么时间发起了什么请求AI 代理生成的原始参数是什么审批信息参数是否通过中间层校验校验规则是什么是否有告警执行信息真实执行的 SQL 语句、目标实例、耗时、返回结果变更信息每个库创建前后的状态变化。技术实现上可以启用 PostgreSQL 的 pgAudit 扩展来记录数据库层面的 DDL同时在中间服务里记录业务层面的操作明细。pgAudit 的配置大致如下CREATE EXTENSION IF NOT EXISTS pgaudit; ALTER SYSTEM SET pgaudit.log write,ddl; ALTER SYSTEM SET pgaudit.log_catalog on;这样任何建库、删库、授权操作都会进入数据库日志。中间服务层面还可以加一层请求级审计把 AI 的意图理解结果和最终执行结果比对发现不一致就告警。异常熔断机制也非常必要。常见设计包括单次批量建库数量上限比如默认不超过 20 个、单位时间建库速率限制比如 5 分钟内不超过 30 次、实例数据库总数配额以及连续失败自动暂停比如连续 3 个库创建失败立即停止批量任务并通知管理员。这些阈值在初期可以设置得保守一些运行稳定后再逐步放宽。6. 踩坑实录AI批量建库常见问题速查6.1 一个事务引发的“CREATE DATABASE不执行”我第一次让 AI 代理批量建库时中间服务把整个建库流程包在了一个数据库事务里想着“要么全成功要么全部回滚”。结果第一个库创建就报错。PostgreSQL 的 CREATE DATABASE 不能在事务块内部执行。也就是说你不能在 BEGIN 之后执行 CREATE DATABASE 再统一 COMMIT。如果你尝试这样做会直接收到类似 syntax error at or near CREATE DATABASE 或者 cannot create database inside a transaction block 的报错。解决方法是把建库操作放到事务外面执行每个库独立提交然后自己实现“部分失败补偿逻辑”。比如 20 个库里第 15 个建失败了前面 14 个已经成功那就把失败原因记录清楚人工决定要不要回滚那 14 个库。这里不能用数据库事务保证“全有或全无”要靠应用层逻辑。6.2 库名大小写和连字符的故事有次代理按用户的自然语言描述把库名生成成了User-Data-03。中间服务当时没有做强校验直接执行了建库。语句是CREATE DATABASE User-Data-03;因为加了双引号PostgreSQL 允许这个名字存在但后续所有连接串都只能用大写混合加连字符的形式非常痛苦。比如 JDBC 连接串里要写jdbc:postgresql://host:5432/User-Data-03大小写和连字符一个都不能错。维护起来简直是灾难。后来我们在中间服务加了硬校验任何包含大写字母、连字符、空格或非下划线开头字符的库名一律拒绝并让代理重新生成。6.3 连接数被测试脚本打爆有一次批量建完 30 个测试库开发团队的自动化脚本随即对每个库发起 20 个连接瞬间产生 600 个连接请求。实例的 max_connections 只有 500其他业务库的连接全部被挤掉整个实例出现抖动。这次事故之后我做了三件事一是把每个库的 CONNECTION LIMIT 明确设置测试库一律 30二是给实例接入 PgBouncer让应用连接先打到连接池再由连接池与数据库建立有限连接三是为 pg_stat_activity 配置了连接数监控超过实例总连接数的 80% 就告警。批量建库时连接数是必须提前算好的资源项不能等到爆了再处理。6.4 模板库被占用导致建库卡死批量建库偶尔会遇到 CREATE DATABASE 长时间挂起的问题。排查后发现不是 SQL 写错了而是目标模板库 template1 上存在长连接导致建库操作拿不到需要的锁。创建数据库需要访问模板库以复制数据文件如果模板库正被其他会话占用建库请求就会等待。解决方法是确保应用业务连接不要直连 template1。同时建库前可以检查模板库上的活动会话必要时用 pg_terminate_backend 清理异常连接。建库批量任务对模板库的并发要求也比较高同一时间只放一个建库任务能有效减少锁等待。6.5 角色权限残留AI 代理批量建库一段时间后某个库要下线。DROP DATABASE 成功后我却发现那个库对应的一堆历史角色还静静躺在 pg_roles 里。这些“孤儿角色”看起来无害实际上会带来管理混乱和潜在安全风险——它们可能还握有其他数据库的部分权限。所以回收机制不能只 DROP 库还要把角色、依赖权限、扩展对象一并处理。梳理角色依赖可以查询 pg_shdepend再按需 REVOKE 或 DROP OWNED BY / DROP ROLE。自动化回收必须把“建库-授权-回收”做成一个完整闭环否则时间一长系统里全是残留。现象可能原因排查方法预防措施CREATE DATABASE 报语法错误语句被放进事务块检查中间服务是否开启了事务包装建库操作放在事务外单独提交库名大小写奇怪连接总报错命名含大写或连字符查看 pg_database 里实际库名中间层强制命名校验实例连接数突然被打满每个库未限制连接查 pg_stat_activity建库时设置 CONNECTION LIMIT引入连接池建库卡住不返回模板库被活动会话占用查 template 库上的会话清理模板库连接串行执行建库库删了但角色还在回收逻辑没处理角色查 pg_roles 和 pg_shdepend回收时同步清理依赖角色与权限7. 最后说几句实在话从我实际搭建这套流程到现在最大的感受是AI 代理建库并不难难的是把流程、权限、容量、回收统统想清楚。AI 让“建库”这个动作从人工菜单变成了自助接口效率提升是真实的但系统性的管理压力也全部转移到了设计阶段。如果你准备在自己的 PostgreSQL 环境里引入 AI 代理批量建库我建议先做三件事单独建一个只带 CREATEDB 属性的自动化角色为中间服务写清楚命名和参数校验规则再配好回收与审计。这套底线守住了后续的体验会顺畅很多。我踩过的那些坑希望你能绕过去。
RELATED

相关推荐

MySQL存储引擎与索引优化实战:从B+树到慢查询排查

MySQL存储引擎与索引优化实战:从B+树到慢查询排查

1. 存储引擎选型的底层逻辑1.1 为什么InnoDB成了默认选项很多刚接触MySQL的朋友都会有这样一个疑问:同为存储引擎,MyISAM和InnoDB到底差在哪里?为什么MySQL从5.5版本开始把InnoDB设成了默认引擎,而且越往后越强调InnoDB的重要性&a…

📅 2026/10/11 3:15:36
MySQL排序深入解析:从ORDER BY语法到索引与Filesort性能优化

MySQL排序深入解析:从ORDER BY语法到索引与Filesort性能优化

做后台系统这些年,我几乎每天都要跟MySQL里的查询结果排序打交道。文章列表按发布时间倒序,订单报表按金额降序,排行榜按浏览量取前N条——一句ORDER BY看上去简单,真正用起来,语法坑、性能坑、数据类型坑一个都不少。…

📅 2026/10/11 3:15:36
网络综合布线课程标准怎么编?六大模块与过程性考核落地指南

网络综合布线课程标准怎么编?六大模块与过程性考核落地指南

简介:《网络综合布线技术》课程标准是计算机网络技术专业的核心教学文档,为教师组织综合布线课程提供完整教学框架。资源以工作项目为逻辑主线,覆盖综合布线六大子系统、系统工程设计、工作区与水平子系统施工、管理间与设备间安装、垂直子系…

📅 2026/10/11 3:15:36
MORE NEWS

更多资讯

📰

医学图像分割实战:ISBI 2015数据集格式转换与预处理全攻略

简介:面向医学图像分割任务(如视网膜血管分割)的ISBI 2015挑战赛数据集,适合科研人员、竞赛选手及深度学习入门者作为基准数据使用,可用于算法复现与效果对比。压缩包内含训练集约160张带标注图像,共234个文…

📰

Netlify部署实战:前端项目从本地到线上的完整上线指南

做前端这些年,我把不少个人项目、小Demo、甚至帮朋友临时做的落地页都放在本地文件夹里。能跑,但别人访问不了,这其实称不上一个真正的网站。直到我把第一个项目通过 Netlify 推到线上,从提交代码到线上生效不到一分钟&#xff0c…

📰

Hermes Agent + 本地 Gemma 4 + 微信接入:用 TaoToken 统一 Key 打通私有 AI 助手全链路

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

📰

[题解]2024CCPC河北省赛-Goose Goose Duck:贪心构造与堆维护的赛时实现拆解

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

📰

浙江EAC认证代办怎么选?这份避坑指南请收好

浙江EAC认证代办怎么选?这份避坑指南请收好最近有好多浙江的制造企业主来找我,问的都是同一个问题:出口俄罗斯的EAC认证到底该找谁办?说实话,这个问题背后藏着的焦虑我特别理解——网上搜一圈,代理机构五花…

📰

128路矩阵开关:把测试系统的物理接线变成软件路由

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

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬