Files
rxthinkcmf-wiki/RXThinkCMF_ThinkPhp8_EleVue/.vitepress/dist/zh/tools/db-migrate.html
T
2026-10-25 18:52:36 +08:00

393 lines
261 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>数据库迁移工具 | RXThinkCMF 开发文档</title>
<meta name="description" content="db:migrate 是一个 CLI 命令行工具,支持在 MySQL / PostgreSQL / SQL Server / Oracle / SQLite 五种数据库之间任意组合迁移。">
<meta name="generator" content="VitePress v1.3.4">
<link rel="preload stylesheet" href="/assets/style.DgIBCYhU.css" as="style">
<script type="module" src="/assets/app.C-UWK-fl.js"></script>
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="modulepreload" href="/assets/chunks/theme.DFOghvK6.js">
<link rel="modulepreload" href="/assets/chunks/framework.B-QBKwc1.js">
<link rel="modulepreload" href="/assets/zh_tools_db-migrate.md.DSxjRdYV.lean.js">
<link rel="icon" type="image/svg+xml" href="/logo.svg">
<link rel="icon" type="image/png" href="/logo.png">
<meta property="twitter:card" content="summary_large_image">
<script src="/banner.js" async type="text/javascript"></script>
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"light",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
<script>var _hmt=_hmt||[];(function(){var e=document.createElement("script");e.src="https://hm.baidu.com/hm.js?09709f15864acfe85b0d8edd6dabcbbc";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})();</script>
<link rel="canonical" href="http://docs.thinkphp8.elevue.rxthink.cn/zh/tools/db-migrate.html">
<meta property="og:type" content="article">
<meta property="og:site_name" content="RXThinkCMF">
<meta property="og:locale" content="zh_CN">
<meta property="og:title" content="数据库迁移工具">
<meta property="og:description" content="db:migrate 是一个 CLI 命令行工具,支持在 MySQL / PostgreSQL / SQL Server / Oracle / SQLite 五种数据库之间任意组合迁移。">
<meta property="og:url" content="http://docs.thinkphp8.elevue.rxthink.cn/zh/tools/db-migrate.html">
<meta property="og:image" content="http://docs.thinkphp8.elevue.rxthink.cn/logo.png">
<meta property="twitter:title" content="数据库迁移工具">
<meta property="twitter:description" content="db:migrate 是一个 CLI 命令行工具,支持在 MySQL / PostgreSQL / SQL Server / Oracle / SQLite 五种数据库之间任意组合迁移。">
<meta property="twitter:url" content="http://docs.thinkphp8.elevue.rxthink.cn/zh/tools/db-migrate.html">
<meta property="twitter:image" content="http://docs.thinkphp8.elevue.rxthink.cn/logo.png">
<script type="application/ld+json">[{"@context":"https://schema.org","@type":"TechArticle","headline":"7.6 数据库迁移工具","description":"db:migrate 是一个 CLI 命令行工具,支持在 MySQL / PostgreSQL / SQL Server / Oracle / SQLite 五种数据库之间任意组合迁移。","url":"http://docs.thinkphp8.elevue.rxthink.cn/zh/tools/db-migrate.html","inLanguage":"zh-CN","mainEntityOfPage":{"@type":"WebPage","@id":"http://docs.thinkphp8.elevue.rxthink.cn/zh/tools/db-migrate.html"},"publisher":{"@type":"Organization","name":"RXThinkCMF","url":"https://www.rxthink.cn","logo":"http://docs.thinkphp8.elevue.rxthink.cn/logo.png","sameAs":["https://gitee.com/rxthinkcmf/RXThinkCMF_ThinkPhp8_EleVue","https://www.rxthink.cn"]},"dateModified":"2026-10-10T12:20:37+08:00"},{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"首页","item":"http://docs.thinkphp8.elevue.rxthink.cn/"},{"@type":"ListItem","position":2,"name":"7. 文件处理"},{"@type":"ListItem","position":3,"name":"7.6 数据库迁移工具","item":"http://docs.thinkphp8.elevue.rxthink.cn/zh/tools/db-migrate.html"}]},{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"迁移失败后如何重试?","acceptedAnswer":{"@type":"Answer","text":"A: 使用 --drop-target-first 选项重新执行,会先删除目标表再重建。"}},{"@type":"Question","name":"如何只迁移部分表?","acceptedAnswer":{"@type":"Answer","text":"A: 使用 --tables 选项指定表名,逗号分隔: php think db:migrate ... --tables=think_user,think_role"}},{"@type":"Question","name":"大表迁移很慢怎么办?","acceptedAnswer":{"@type":"Answer","text":"A: 调大 --batch-size,如 --batch-size=5000。默认 1000 行一批,增大批量可减少数据库交互次数。"}},{"@type":"Question","name":"目标库不存在会自动创建吗?","acceptedAnswer":{"@type":"Answer","text":"A: 会。所有驱动(MySQL / PostgreSQL / SQL Server / Oracle / SQLite)在目标库不存在时都会自动创建,无需手动建库。建库时会自动从源库读取 collation 并应用(仅当源与目标驱动相同时)。"}},{"@type":"Question","name":"PostgreSQL 报 SQLSTATE 08006 错误怎么办?","acceptedAnswer":{"@type":"Answer","text":"A: 08006 是连接异常的通用错误码,在中文环境下错误信息可能乱码。工具会主动连接 postgres 维护库查询 pg_database 确认目标库是否不存在。如果确认不存在会自动建库;如果维护库也连不上,请检查 PostgreSQL 服务是否启动、端口是否正确、密码是否正确。"}},{"@type":"Question","name":"SQL Server 报\"登录失败\"怎么办?","acceptedAnswer":{"@type":"Answer","text":"A: SQL Server 数据库不存在时会返回\"登录失败\"(SQLSTATE 28000),工具会自动连接 master 库验证凭据并区分。如果确实是密码错误,请检查 --dst-password。"}},{"@type":"Question","name":"索引、外键、注释、默认值会迁移吗?","acceptedAnswer":{"@type":"Answer","text":"A: 会。迁移工具在建表阶段会同步迁移以下元数据: - 索引:自动读取源表的非主键索引(UNIQUE / 普通 / 全文),在目标表创建后执行 CREATE INDEX - 外键:自动读取源表的外键约束,在所有表创建后统一添加 ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY,避免引用顺序问题 - 字段注释:MySQL 目标直接写入 COMMENT 子句;PostgreSQL / Oracle 使用 COMMENT ON COLUMN;SQL Server 使用 sp_addextendedproperty - 表注释:MySQL 使用 ALTER TABLE COMMENT;PostgreSQL / Oracle 使用 COMMENT ON TABLE - 默认值:完整保留,包括空字符串 DEFAULT ''、数值默认值、CURRENT_TIMESTAMP、CURRENT_DATE、函数调用(如 uuid_generate_v4())等 - enum/set:自动迁移候选值,生成 CHECK 约束 - decimal/datetime 精度:保留精度参数(如 decimal(10,2) → numeric(10,2),datetime(3) → timestamp(3)) - collation:建库时自动应用源库 collation(仅同驱动时);建表时迁移表级和列级 collation(MySQL / PostgreSQL)"}},{"@type":"Question","name":"数据迁移的可靠性如何保证?","acceptedAnswer":{"@type":"Answer","text":"A: 迁移工具有以下保障机制: - 事务保护:每个 --batch-size(默认 1000 行)为一个独立事务,提交后即生效;当前批次失败时回滚,已提交的历史批次不受影响 - 稳定排序:分页查询基于主键列 ORDER BY,确保大表分批迁移不会漏行或重复 - 退出码:命令成功返回 0,失败或行数校验未通过返回 1,可用于 CI/CD 自动化判断 - 行数校验:迁移完成后逐表对比源和目标的行数,输出 PASS/FAIL"}},{"@type":"Question","name":"Oracle 自增列如何处理?","acceptedAnswer":{"@type":"Answer","text":"A: Oracle 没有原生自增语法。迁移工具会自动为自增列创建序列(CREATE SEQUENCE)和触发器(CREATE TRIGGER),实现等效的自增功能。"}},{"@type":"Question","name":"含点号的数据库名支持吗?","acceptedAnswer":{"@type":"Answer","text":"A: 支持。如 rxthinkcmf.thinkphp8.elevue 这类含点号的库名,各驱动均已适配。"}},{"@type":"Question","name":"SQLite 作为目标有什么限制?","acceptedAnswer":{"@type":"Answer","text":"A: SQLite 不支持字段注释、表注释和 collation。迁移完成后数据完整,索引和外键正常迁移。"}}]}]</script>
</head>
<body>
<div id="app"><div class="Layout" data-v-d8b57b2d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-c8291ffa></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-c8291ffa> Skip to content </a><!--]--><!----><header class="VPNav" data-v-d8b57b2d data-v-7ad780c2><div class="VPNavBar" data-v-7ad780c2 data-v-9fd4d1dd><div class="wrapper" data-v-9fd4d1dd><div class="container" data-v-9fd4d1dd><div class="title" data-v-9fd4d1dd><div class="VPNavBarTitle has-sidebar" data-v-9fd4d1dd data-v-0ad69264><a class="title" href="/" data-v-0ad69264><!--[--><!--]--><!--[--><img class="VPImage logo" src="/logo.svg" alt data-v-ab19afbb><!--]--><span data-v-0ad69264>小蚂蚁云</span><!--[--><!--]--></a></div></div><div class="content" data-v-9fd4d1dd><div class="content-body" data-v-9fd4d1dd><!--[--><!--]--><div class="VPNavBarSearch search" data-v-9fd4d1dd><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-9fd4d1dd data-v-afb2845e><span id="main-nav-aria-label" class="visually-hidden" data-v-afb2845e> Main Navigation </span><!--[--><!--[--><a class="VPLink link vp-external-link-icon VPNavBarMenuLink" href="https://www.rxthink.cn" target="_blank" rel="noreferrer" tabindex="0" data-v-afb2845e data-v-08fbf4b6><!--[--><span data-v-08fbf4b6>官网</span><!--]--></a><!--]--><!--[--><a class="VPLink link vp-external-link-icon VPNavBarMenuLink" href="https://www.rxthink.cn/goods/detail/2" target="_blank" rel="noreferrer" tabindex="0" data-v-afb2845e data-v-08fbf4b6><!--[--><span data-v-08fbf4b6>授权</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-afb2845e data-v-af5898d3><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-af5898d3><span class="text" data-v-af5898d3><!----><span data-v-af5898d3>部署文档</span><span class="vpi-chevron-down text-icon" data-v-af5898d3></span></span></button><div class="menu" data-v-af5898d3><div class="VPMenu" data-v-af5898d3 data-v-20ed86d6><div class="items" data-v-20ed86d6><!--[--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp6.layui.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF混编版ThinkPHP6+Layui版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp6.elevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离ThinkPHP6+ElementPlus版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp6.antdvue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离ThinkPHP6+AntDesign版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp6.naivevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离ThinkPHP6+NaiveUI版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp8.layui.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF混编版ThinkPHP8+Layui版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp8.elevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离ThinkPHP8+ElementPlus版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp8.antdvue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离ThinkPHP8+AntDesign版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp8.naivevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离ThinkPHP8+NaiveUI版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://docs.laravel13.layui.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF混编版Laravel13+Layui版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://docs.laravel13.elevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离Laravel13+ElementPlus版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://docs.laravel13.antdvue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离Laravel13+AntDesign版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://docs.laravel13.naivevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离Laravel13+NaiveUI版本<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-afb2845e data-v-af5898d3><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-af5898d3><span class="text" data-v-af5898d3><!----><span data-v-af5898d3>在线演示</span><span class="vpi-chevron-down text-icon" data-v-af5898d3></span></span></button><div class="menu" data-v-af5898d3><div class="VPMenu" data-v-af5898d3 data-v-20ed86d6><div class="items" data-v-20ed86d6><!--[--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp6.layui.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF混编版ThinkPHP6+Layui版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp6.elevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离ThinkPHP6+ElementPlus版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp6.antdvue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离ThinkPHP6+AntDesign版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp6.naivevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离ThinkPHP6+NaiveUI版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp8.layui.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF混编版ThinkPHP8+Layui版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp8.elevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离ThinkPHP8+ElementPlus版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp8.antdvue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离ThinkPHP8+AntDesign版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp8.naivevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离ThinkPHP8+NaiveUI版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://manage.laravel13.layui.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF混编版Laravel13+Layui版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://manage.laravel13.elevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离Laravel13+ElementPlus版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://manage.laravel13.antdvue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离Laravel13+AntDesign版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="http://manage.laravel13.naivevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->RXThinkCMF前后端分离Laravel13+NaiveUI版本<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/zh/other/sponsor.html" tabindex="0" data-v-afb2845e data-v-08fbf4b6><!--[--><span data-v-08fbf4b6>广告赞助</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-afb2845e data-v-af5898d3><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-af5898d3><span class="text" data-v-af5898d3><!----><span data-v-af5898d3>相关链接</span><span class="vpi-chevron-down text-icon" data-v-af5898d3></span></span></button><div class="menu" data-v-af5898d3><div class="VPMenu" data-v-af5898d3 data-v-20ed86d6><div class="items" data-v-20ed86d6><!--[--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="https://www.rxthink.cn" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->官方网站<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="https://gitee.com/rxthinkcmf/RXThinkCMF_ThinkPhp8_EleVue" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->Gitee 仓库<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="https://www.thinkphp.cn/" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->ThinkPHP 官网<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="https://cn.vuejs.org/" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->Vue3 文档<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-20ed86d6 data-v-f51f088d><a class="VPLink link vp-external-link-icon" href="https://element-plus.org/zh-CN/" target="_blank" rel="noreferrer" data-v-f51f088d><!--[-->ElementPlus<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-9fd4d1dd data-v-3f90c1a5><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-3f90c1a5 data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-9fd4d1dd data-v-ef6192dc data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://gitee.com/rxthinkcmf/RXThinkCMF_ThinkPhp8_EleVue" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-358b6670><span class="vpi-social-github" /></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-9fd4d1dd data-v-f953d92f data-v-af5898d3><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-af5898d3><span class="vpi-more-horizontal icon" data-v-af5898d3></span></button><div class="menu" data-v-af5898d3><div class="VPMenu" data-v-af5898d3 data-v-20ed86d6><!----><!--[--><!--[--><!----><div class="group" data-v-f953d92f><div class="item appearance" data-v-f953d92f><p class="label" data-v-f953d92f>Appearance</p><div class="appearance-action" data-v-f953d92f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-f953d92f data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div></div></div><div class="group" data-v-f953d92f><div class="item social-links" data-v-f953d92f><div class="VPSocialLinks social-links-list" data-v-f953d92f data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://gitee.com/rxthinkcmf/RXThinkCMF_ThinkPhp8_EleVue" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-358b6670><span class="vpi-social-github" /></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-9fd4d1dd data-v-6bee1efd><span class="container" data-v-6bee1efd><span class="top" data-v-6bee1efd></span><span class="middle" data-v-6bee1efd></span><span class="bottom" data-v-6bee1efd></span></span></button></div></div></div></div><div class="divider" data-v-9fd4d1dd><div class="divider-line" data-v-9fd4d1dd></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-d8b57b2d data-v-2488c25a><div class="container" data-v-2488c25a><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-2488c25a><span class="vpi-align-left menu-icon" data-v-2488c25a></span><span class="menu-text" data-v-2488c25a>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-2488c25a data-v-883964e0><button data-v-883964e0>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-d8b57b2d data-v-42c4c606><div class="curtain" data-v-42c4c606></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-42c4c606><span class="visually-hidden" id="sidebar-aria-label" data-v-42c4c606> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>📖 1. 了解项目</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/introduction.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>1.1 项目介绍</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/why.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>1.2 为什么选择我们</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/directory.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>1.3 项目目录结构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/course.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>1.4 新手入门指南</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/tech-stack.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>1.5 技术栈说明</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/changelog.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>1.6 更新日志</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>🚀 2. 快速入门</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/quickstart/environment.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>2.1 开发环境准备</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/quickstart/backend-start.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>2.2 后端服务启动</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/quickstart/frontend-start.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>2.3 前端服务启动</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/quickstart/database-init.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>2.4 数据库初始化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/quickstart/env-vars.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>2.5 环境变量配置</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/quickstart/first-api.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>2.6 第一个接口调试</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/quickstart/docker.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>2.7 Docker 快速体验</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/quickstart/faq.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>2.8 常见问题 FAQ</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>🧪 3. 模块开发实战</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/guide/overview.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>3.1 概述与目标</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/guide/database.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>3.2 数据库建表</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/guide/model.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>3.3 模型层开发</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/guide/validator.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>3.4 验证器开发</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/guide/logic.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>3.5 逻辑层开发</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/guide/controller.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>3.6 控制器开发</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/guide/route.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>3.7 路由注册</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/guide/permission.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>3.8 权限节点配置</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/guide/frontend-integration.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>3.9 前端联调指引</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/guide/code-list.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>3.10 完整代码清单</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/guide/faq.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>3.11 常见问题与排错</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>🏛️ 4. 架构设计</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/architecture/overview.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>4.1 整体架构概览</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/architecture/request-flow.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>4.2 请求处理链路</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/architecture/backend-layer.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>4.3 后端分层架构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/architecture/frontend-layer.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>4.4 前端分层架构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/architecture/directory-design.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>4.5 目录结构设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/architecture/base-classes.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>4.6 核心基类体系</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/architecture/cross-cutting.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>4.7 横切机制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/architecture/cache.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>4.8 缓存架构设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/architecture/database-design.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>4.9 数据库设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/architecture/security.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>4.10 安全架构设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/architecture/extensibility.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>4.11 扩展性设计</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>🔐 5. 核心功能</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><section class="VPSidebarItem level-1 collapsible" data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>认证与安全</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/jwt.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.1 用户认证(JWT)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/auth-flow.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.2 认证流程实战</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/captcha.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.3 验证码机制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/rbac.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.4 权限管理(RBAC)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/cors.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.5 跨域资源共享</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/password.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.6 密码加密服务</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/demo-mode.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.7 演示模式</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>数据与配置</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/tenant.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.8 多租户隔离</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/data-scope.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.9 数据权限</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/dict.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.10 字典模块</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/dict-guide.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.11 字典配置与使用</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/config.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.12 系统配置管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/param.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.13 系统参数管理</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>日志与监控</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/operation-log.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.14 操作日志</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/login-log.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.15 登录日志</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/exception.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.16 异常与响应处理</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>防护与治理</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/idempotent.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.17 防重复提交</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>注解系统</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/core/attributes.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>5.18 注解系统总览</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>📦 6. 业务模块</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/user.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.1 用户管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/role.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.2 角色管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/menu.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.3 菜单管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/dept.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.4 部门管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/level.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.5 职级管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/position.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.6 岗位管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/article.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.7 文章管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/content.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.8 公告与链接管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/city.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.9 行政区划管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/category.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.10 分类管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/job.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.11 定时任务</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/param.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.12 参数管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/tenant.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.13 租户管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/filetemplate.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.14 文件模板管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/modules/index.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>6.15 首页与个人中心</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible has-active" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>🧰 7. 文件处理</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/tools/upload.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>7.1 文件上传全流程</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/tools/upload-config.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>7.2 上传配置详解</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/tools/rich-text.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>7.3 富文本处理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/tools/excel.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>7.4 数据导入导出</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/tools/file-components.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>7.5 前端文件组件</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/tools/db-migrate.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>7.6 数据库迁移工具</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>🔗 8. 接口规范与对接</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/api-spec/response.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>8.1 统一响应格式</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/api-spec/error-code.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>8.2 错误码对照表</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/api-spec/pagination.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>8.3 分页查询规范</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/api-spec/upload.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>8.4 文件上传接口</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/api-spec/dict-api.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>8.5 字典数据接口</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/api-spec/token.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>8.6 Token 使用说明</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/api-spec/overview.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>8.7 API 接口总览</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>🖥️ 9. 前端开发</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><section class="VPSidebarItem level-1 collapsible" data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>工程基础</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/overview.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.1 前端工程概述</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/directory.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.2 目录结构详解</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/env-config.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.3 环境与构建配置</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>核心机制</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/http.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.4 HTTP 请求封装</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/router.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.5 路由与动态菜单</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/store.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.6 状态管理(Pinia)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/permission.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.7 权限控制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/login.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.8 登录流程</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>公共组件</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/display-components.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.9 数据展示组件</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/form-components.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.10 数据录入组件</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/excel-components.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.11 Excel 导入导出组件</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>开发实践</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/new-page.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.12 新增页面开发步骤</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/api-module.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.13 API 模块编写规范</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/style.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.14 样式与主题定制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/layout.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.15 布局系统</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/utils.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.16 工具函数</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/frontend/i18n.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>9.17 国际化(i18n)</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>🔧 10. 代码生成器</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/generator/overview.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>10.1 概述与架构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/generator/cli.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>10.2 CLI 命令行使用</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/generator/web-ui.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>10.3 Web 管理界面</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/generator/parser.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>10.4 表结构解析引擎</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/generator/code-engine.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>10.5 代码生成引擎</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/generator/templates.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>10.6 自定义模板开发</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/generator/config.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>10.7 配置文件详解</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/generator/demo.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>10.8 实战案例</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/generator/faq.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>10.9 常见问题</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>⚙️ 11. 运维部署</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/deploy/checklist.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>11.1 部署 Checklist</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/deploy/env-plan.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>11.2 环境规划</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/deploy/db-migrate.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>11.3 数据库迁移</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/deploy/backend.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>11.4 后端部署</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/deploy/frontend.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>11.5 前端部署</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/deploy/docker.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>11.6 Docker 生产部署</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/deploy/performance.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>11.7 性能调优</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/deploy/security.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>11.8 安全加固清单</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/deploy/backup.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>11.9 备份与恢复</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/deploy/troubleshooting.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>11.10 故障排查手册</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/deploy/ci-cd.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>11.11 CI/CD 流水线</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>📋 12. 规范标准</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><section class="VPSidebarItem level-1 collapsible" data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>⭐ 必须遵守</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/standards/api-response.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>12.1 API 响应规范</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/standards/pagination.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>12.2 分页查询规范</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/standards/git.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>12.3 Git 提交规范</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h3 class="text" data-v-edd2eed8>📌 建议遵守</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/standards/deletion.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>12.4 数据删除规范</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/standards/code-review.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>12.5 代码审查清单</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/standards/backend-code.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>12.6 后端编码规范</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/standards/frontend-code.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>12.7 前端编码规范</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-edd2eed8><div class="item" role="button" tabindex="0" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><h2 class="text" data-v-edd2eed8>📄 附录</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-edd2eed8><span class="vpi-chevron-right caret-icon" data-v-edd2eed8></span></div></div><div class="items" data-v-edd2eed8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/appendix/faq.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>A. 常见问题汇总</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/appendix/database-tables.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>B. 数据库表结构速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/appendix/config-reference.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>C. 配置项速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/appendix/functions.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>D. 公共函数速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/appendix/api-cheatsheet.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>E. API 接口速查表</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/appendix/middleware.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>F. 中间件执行顺序</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/appendix/components.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>G. 前端组件速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/appendix/stores.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>H. 前端 Store 速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/appendix/enums.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>I. 前端 Enums 速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/appendix/glossary.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>J. 术语表</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/other/contributing.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>K. 贡献指南</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/other/declare.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>L. 免责声明</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link link" href="/zh/other/sponsor.html" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>M. 广告赞助</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edd2eed8><div class="item" data-v-edd2eed8><div class="indicator" data-v-edd2eed8></div><a class="VPLink link vp-external-link-icon link" href="https://gitee.com/rxthinkcmf/RXThinkCMF_ThinkPhp8_EleVue" target="_blank" rel="noreferrer" data-v-edd2eed8><!--[--><p class="text" data-v-edd2eed8>N. 开源协议</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-d8b57b2d data-v-9a6c75ad><div class="VPDoc has-sidebar has-aside" data-v-9a6c75ad data-v-e6f2a212><!--[--><!--]--><div class="container" data-v-e6f2a212><div class="aside" data-v-e6f2a212><div class="aside-curtain" data-v-e6f2a212></div><div class="aside-container" data-v-e6f2a212><div class="aside-content" data-v-e6f2a212><div class="VPDocAside" data-v-e6f2a212 data-v-cb998dce><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-cb998dce data-v-f610f197><div class="content" data-v-f610f197><div class="outline-marker" data-v-f610f197></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-f610f197>本页内容</div><ul class="VPDocOutlineItem root" data-v-f610f197 data-v-53c99d69><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-cb998dce></div><!--[--><!--[--><!--[--><!--[--><!--[--><div class="VPDocAsideSponsors" data-v-46d2db61><div class="VPSponsors vp-sponsor aside"><!--[--><section class="vp-sponsor-section"><!----><div class="VPSponsorsGrid vp-sponsor-grid mini"><!--[--><div class="vp-sponsor-grid-item"><a class="vp-sponsor-grid-link" href="https://www.rxthink.cn" target="_blank" rel="sponsored noopener"><article class="vp-sponsor-grid-box"><h4 class="visually-hidden">Become a sponsor</h4><img class="vp-sponsor-grid-image" src="/sponsor/rxthinkcmf.png" alt="Become a sponsor"></article></a></div><!--]--></div></section><section class="vp-sponsor-section"><!----><div class="VPSponsorsGrid vp-sponsor-grid xmini"><!--[--><div class="vp-sponsor-grid-item"><a class="vp-sponsor-grid-link" href="https://www.rxthink.cn" target="_blank" rel="sponsored noopener"><article class="vp-sponsor-grid-box"><h4 class="visually-hidden">企业级中台解决方案</h4><img class="vp-sponsor-grid-image" src="/sponsor/rxthinkcmf.png" alt="企业级中台解决方案"></article></a></div><div class="vp-sponsor-grid-item"><a class="vp-sponsor-grid-link" href="https://www.rxthink.cn" target="_blank" rel="sponsored noopener"><article class="vp-sponsor-grid-box"><h4 class="visually-hidden">企业级中台解决方案</h4><img class="vp-sponsor-grid-image" src="/sponsor/rxthinkcmf.png" alt="企业级中台解决方案"></article></a></div><!--]--></div></section><!--]--></div></div><a class="banner mp" href="https://www.rxthink.cn" target="_blank" data-v-46d2db61><img width="22" height="22" src="/sponsor/rxthinkcmf.png" data-v-46d2db61><span data-v-46d2db61><p class="extra-info" data-v-46d2db61>赋能开发者</p><p class="heading" data-v-46d2db61>企业级中台解决方案</p><p class="extra-info" data-v-46d2db61>助力企业发展</p></span></a><a class="banner cert" href="https://www.rxthink.cn" target="_blank" data-v-46d2db61><img width="22" height="22" src="/sponsor/rxthinkcmf.png" data-v-46d2db61><span data-v-46d2db61><p class="extra-info" data-v-46d2db61>赋能开发者</p><p class="heading" data-v-46d2db61>企业级中台解决方案</p><p class="extra-info" data-v-46d2db61>助力企业发展</p></span></a><!--]--><!--]--><!--]--><!--]--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e6f2a212><div class="content-container" data-v-e6f2a212><!--[--><!--]--><main class="main" data-v-e6f2a212><div style="position:relative;" class="vp-doc _zh_tools_db-migrate" data-v-e6f2a212><div><h1 id="_7-6-数据库迁移工具" tabindex="-1">7.6 数据库迁移工具 <a class="header-anchor" href="#_7-6-数据库迁移工具" aria-label="Permalink to &quot;7.6 数据库迁移工具&quot;">​</a></h1><div class="tip custom-block"><p class="custom-block-title">概述</p><p><code>db:migrate</code> 是一个 CLI 命令行工具,支持在 MySQL / PostgreSQL / SQL Server / Oracle / SQLite 五种数据库之间任意组合迁移。完整迁移流程包含自动建库、建表结构(含索引、外键、注释、自增、collation)、分批迁移数据、重置自增序列、逐表行数校验 5 个步骤。数据迁移基于主键稳定排序,支持事务保护与自动回滚。目标库不存在时自动创建,支持含点号的数据库名。</p></div><h2 id="迁移流程" tabindex="-1">迁移流程 <a class="header-anchor" href="#迁移流程" aria-label="Permalink to &quot;迁移流程&quot;">​</a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>┌──────────────────────────────────────────────────────────────┐</span></span>
<span class="line"><span>│ 数据库迁移 5 步流程 │</span></span>
<span class="line"><span>└──────────────────────────────────────────────────────────────┘</span></span>
<span class="line"><span></span></span>
<span class="line"><span>[1/5] 建目标库</span></span>
<span class="line"><span>│ 目标库不存在时自动创建(所有驱动均支持)</span></span>
<span class="line"><span>│ 自动从源库读取 collation 并应用(仅源与目标驱动相同时)</span></span>
<span class="line"><span>│ MySQL: CREATE DATABASE ... COLLATE | PgSQL: LC_COLLATE</span></span>
<span class="line"><span>│ SqlServer: CREATE DATABASE ... COLLATE | Oracle: CREATE USER</span></span>
<span class="line"><span>│ SQLite: 自动创建文件</span></span>
<span class="line"><span>▼</span></span>
<span class="line"><span>[2/5] 建表结构 + 索引 + 注释 + 外键</span></span>
<span class="line"><span>│ 源库 getTableFields() → DbSchemaBuilder 生成 DDL → 目标库执行</span></span>
<span class="line"><span>│ 自动迁移字段注释(MySQL: COMMENT 子句 | PgSQL/Oracle: COMMENT ON COLUMN | SqlServer: sp_addextendedproperty)</span></span>
<span class="line"><span>│ 自动迁移表注释(MySQL: ALTER TABLE COMMENT | PgSQL/Oracle: COMMENT ON TABLE)</span></span>
<span class="line"><span>│ 自动迁移非主键索引(UNIQUE INDEX / 普通 INDEX / 全文索引)</span></span>
<span class="line"><span>│ 自动迁移外键约束(所有表创建后统一添加,避免引用顺序问题)</span></span>
<span class="line"><span>│ 字段默认值完整保留(含空字符串 DEFAULT &#39;&#39;,函数型默认值自动识别)</span></span>
<span class="line"><span>│ enum/set 类型自动迁移候选值(生成 CHECK 约束)</span></span>
<span class="line"><span>│ decimal/datetime 精度保留(如 decimal(10,2)、datetime(3))</span></span>
<span class="line"><span>│ 排序规则(collation)自动迁移:表级 + 列级(MySQL/PostgreSQL)</span></span>
<span class="line"><span>│ Oracle 自增:自动创建序列+触发器</span></span>
<span class="line"><span>│ 支持 --drop-target-first 先删后建</span></span>
<span class="line"><span>▼</span></span>
<span class="line"><span>[3/5] 逐表迁移数据(事务保护)</span></span>
<span class="line"><span>│ 按 batch-size(默认 1000)分页读取,每页再拆为 100 行的 INSERT 语句</span></span>
<span class="line"><span>│ 每个 batch-size 为一个独立事务,提交后即生效</span></span>
<span class="line"><span>│ 当前批次失败时回滚,已提交的历史批次不受影响</span></span>
<span class="line"><span>│ 基于主键 ORDER BY 稳定排序,避免分页漏行/重复</span></span>
<span class="line"><span>│ blob 字段使用 PDO::PARAM_LOB 绑定</span></span>
<span class="line"><span>│ SQL Server: 自动开关 IDENTITY_INSERT</span></span>
<span class="line"><span>▼</span></span>
<span class="line"><span>[4/5] 重置自增序列</span></span>
<span class="line"><span>│ PostgreSQL: SELECT setval 重置序列到 MAX(id)+1</span></span>
<span class="line"><span>│ SQL Server: DBCC CHECKIDENT 重置标识种子</span></span>
<span class="line"><span>│ Oracle: ALTER SEQUENCE 重置序列</span></span>
<span class="line"><span>│ MySQL / SQLite: 跳过(无需重置)</span></span>
<span class="line"><span>▼</span></span>
<span class="line"><span>[5/5] 逐表行数校验</span></span>
<span class="line"><span> SELECT COUNT(*) 对比源和目标,输出 PASS/FAIL</span></span></code></pre></div><h2 id="命令格式" tabindex="-1">命令格式 <a class="header-anchor" href="#命令格式" aria-label="Permalink to &quot;命令格式&quot;">​</a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 数据库迁移命令</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># php think db:migrate → 调用 ThinkPHP 命令行的数据库迁移工具</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># [选项] → 通过 --key=value 格式传入源/目标数据库连接参数</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [选项]</span></span></code></pre></div><h3 id="必填选项" tabindex="-1">必填选项 <a class="header-anchor" href="#必填选项" aria-label="Permalink to &quot;必填选项&quot;">​</a></h3><table tabindex="0"><thead><tr><th>选项</th><th>说明</th></tr></thead><tbody><tr><td><code>--src-type</code></td><td>源数据库驱动:<code>mysql</code> / <code>pgsql</code> / <code>sqlsrv</code> / <code>oracle</code> / <code>sqlite</code></td></tr><tr><td><code>--src-database</code></td><td>源数据库名</td></tr><tr><td><code>--dst-type</code></td><td>目标数据库驱动:<code>mysql</code> / <code>pgsql</code> / <code>sqlsrv</code> / <code>oracle</code> / <code>sqlite</code></td></tr><tr><td><code>--dst-database</code></td><td>目标数据库名</td></tr></tbody></table><h3 id="源连接选项" tabindex="-1">源连接选项 <a class="header-anchor" href="#源连接选项" aria-label="Permalink to &quot;源连接选项&quot;">​</a></h3><table tabindex="0"><thead><tr><th>选项</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>--src-host</code></td><td><code>127.0.0.1</code></td><td>源主机地址</td></tr><tr><td><code>--src-hostport</code></td><td>自动推断</td><td>源端口(mysql=3306, pgsql=5432, sqlsrv=1433, oracle=1521)</td></tr><tr><td><code>--src-username</code></td><td>-</td><td>源用户名(SQLite 除外)</td></tr><tr><td><code>--src-password</code></td><td>-</td><td>源密码(SQLite 除外)</td></tr></tbody></table><h3 id="目标连接选项" tabindex="-1">目标连接选项 <a class="header-anchor" href="#目标连接选项" aria-label="Permalink to &quot;目标连接选项&quot;">​</a></h3><table tabindex="0"><thead><tr><th>选项</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>--dst-host</code></td><td><code>127.0.0.1</code></td><td>目标主机地址</td></tr><tr><td><code>--dst-hostport</code></td><td>自动推断</td><td>目标端口</td></tr><tr><td><code>--dst-username</code></td><td>-</td><td>目标用户名(SQLite 除外)</td></tr><tr><td><code>--dst-password</code></td><td>-</td><td>目标密码(SQLite 除外)</td></tr></tbody></table><h3 id="迁移选项" tabindex="-1">迁移选项 <a class="header-anchor" href="#迁移选项" aria-label="Permalink to &quot;迁移选项&quot;">​</a></h3><table tabindex="0"><thead><tr><th>选项</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>--drop-target-first</code></td><td>否</td><td>迁移前先删除目标库中的同名表</td></tr><tr><td><code>--batch-size</code></td><td><code>1000</code></td><td>每批读取的行数(影响内存占用与迁移速度)</td></tr><tr><td><code>--tables</code></td><td>全部</td><td>只迁移指定表(逗号分隔)</td></tr></tbody></table><h2 id="迁移命令签名" tabindex="-1">迁移命令签名 <a class="header-anchor" href="#迁移命令签名" aria-label="Permalink to &quot;迁移命令签名&quot;">​</a></h2><h3 id="MySQL-→-PostgreSQL" tabindex="-1">MySQL → PostgreSQL <a class="header-anchor" href="#MySQL-→-PostgreSQL" aria-label="Permalink to &quot;MySQL → PostgreSQL&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># MySQL 迁移到 PostgreSQL</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --src-* → 源数据库连接参数(MySQL)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --dst-* → 目标数据库连接参数(PostgreSQL)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --drop-target-first → 迁移前先删除目标库中的同名表(避免表已存在报错)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=pgsql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-hostport=5432</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=postgres</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span></code></pre></div><h3 id="MySQL-→-SQL-Server" tabindex="-1">MySQL → SQL Server <a class="header-anchor" href="#MySQL-→-SQL-Server" aria-label="Permalink to &quot;MySQL → SQL Server&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># MySQL 迁移到 SQL Server</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --dst-type=sqlsrv → 目标驱动为 SQL Server</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --dst-hostport=1433 → SQL Server 默认端口</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=sqlsrv</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-hostport=1433</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=sa</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span></code></pre></div><h3 id="MySQL-→-SQLite" tabindex="-1">MySQL → SQLite <a class="header-anchor" href="#MySQL-→-SQLite" aria-label="Permalink to &quot;MySQL → SQLite&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># MySQL 迁移到 SQLite</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --dst-type=sqlite → 目标驱动为 SQLite(无需用户名密码)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --dst-database → SQLite 文件路径(文件不存在时自动创建)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=sqlite</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=runtime/rxthinkcmf.thinkphp8.elevue.db</span></span></code></pre></div><h3 id="MySQL-→-MySQL-同库复制-" tabindex="-1">MySQL → MySQL(同库复制) <a class="header-anchor" href="#MySQL-→-MySQL-同库复制-" aria-label="Permalink to &quot;MySQL → MySQL(同库复制)&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># MySQL 同库复制(源和目标在同一 MySQL 实例,数据库名不同)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 不带 --drop-target-first → 目标表已存在时跳过(不删除)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=source_db</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=target_db</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=root</span></span></code></pre></div><h3 id="PostgreSQL-→-MySQL" tabindex="-1">PostgreSQL → MySQL <a class="header-anchor" href="#PostgreSQL-→-MySQL" aria-label="Permalink to &quot;PostgreSQL → MySQL&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># PostgreSQL 迁移到 MySQL</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=pgsql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-hostport=5432</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=postgres</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span></code></pre></div><h3 id="SQL-Server-→-MySQL" tabindex="-1">SQL Server → MySQL <a class="header-anchor" href="#SQL-Server-→-MySQL" aria-label="Permalink to &quot;SQL Server → MySQL&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># SQL Server 迁移到 MySQL</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=sqlsrv</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-hostport=1433</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=sa</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span></code></pre></div><h3 id="只迁移指定表" tabindex="-1">只迁移指定表 <a class="header-anchor" href="#只迁移指定表" aria-label="Permalink to &quot;只迁移指定表&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 只迁移指定表(逗号分隔表名,不含前缀)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --tables=think_user,think_role,think_menu → 只迁移这 3 张表</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=pgsql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-hostport=5432</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=postgres</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --tables=think_user,think_role,think_menu</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span></code></pre></div><h2 id="迁移输出日志" tabindex="-1">迁移输出日志 <a class="header-anchor" href="#迁移输出日志" aria-label="Permalink to &quot;迁移输出日志&quot;">​</a></h2><h3 id="MySQL-→-PostgreSQL-完整日志" tabindex="-1">MySQL → PostgreSQL 完整日志 <a class="header-anchor" href="#MySQL-→-PostgreSQL-完整日志" aria-label="Permalink to &quot;MySQL → PostgreSQL 完整日志&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">$</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=pgsql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-hostport=5432</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=postgres</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 源: mysql:rxthinkcmf.thinkphp8.elevue → 目标: pgsql:rxthinkcmf.thinkphp8.elevue</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 待迁移 25 张表</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 目标库</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已就绪</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库 完成(耗时 0ms)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构(25 张表)...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构 完成(耗时 440ms),25 张表,118 个索引,0 个外键</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [1/25] 正在迁移 think_article...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_article</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +13(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 13)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_article</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> 共</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 13</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 10ms)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [2/25] 正在迁移 think_category...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_category</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +150(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 150)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_category</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> 共</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 150</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 12ms)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [3/25] 正在迁移 think_city...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_city</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +1000(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 1000)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_city</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +1000(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 2000)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_city</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +1000(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 3000)</span></span>
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(大表分批输出进度,每批</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1000</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行)...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_city</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +562(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 783562)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_city</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> 共</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 783562</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 10m10s)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [4/25] 正在迁移 think_config...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_config</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +1(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 1)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_config</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> 共</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 11ms)</span></span>
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(其余表类似)</span><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [25/25] 正在迁移 think_user_role...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_user_role</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +25(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 25)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_user_role</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> 共</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 25</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 6ms)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据 完成(耗时 10m10s),共 785215 行</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列 完成(耗时 23ms)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_article</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">13</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">13</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_category</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">150</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">150</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_city</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">783562</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">783562</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_config</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">1</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(其余表类似)</span><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_user_role</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">25</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">25</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验 完成(耗时 452ms),25 张表全部 PASS</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移完成</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 成功:785215 行 / 25 张表 / 总耗时 10m11s</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span></code></pre></div><h3 id="MySQL-→-SQL-Server-日志摘要" tabindex="-1">MySQL → SQL Server 日志摘要 <a class="header-anchor" href="#MySQL-→-SQL-Server-日志摘要" aria-label="Permalink to &quot;MySQL → SQL Server 日志摘要&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">$</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=sqlsrv</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-hostport=1433</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=sa</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 源: mysql:rxthinkcmf.thinkphp8.elevue → 目标: sqlsrv:rxthinkcmf.thinkphp8.elevue</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 待迁移 25 张表</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 目标库</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已就绪</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库 完成(耗时 0ms)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构(25 张表)...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构 完成(耗时 1.5s),25 张表,118 个索引,0 个外键</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据...</span></span>
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(逐表迁移,SQL</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> Server</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 每行耗时较</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> MySQL/SQLite</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 更长)...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据 完成(耗时 11m48s),共 785231 行</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列 完成(耗时 52ms)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验...</span></span>
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(25</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 张表全部</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> PASS)...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验 完成(耗时 681ms),25 张表全部 PASS</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移完成</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 成功:785231 行 / 25 张表 / 总耗时 11m50s</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span></code></pre></div><h3 id="MySQL-→-Oracle-日志摘要" tabindex="-1">MySQL → Oracle 日志摘要 <a class="header-anchor" href="#MySQL-→-Oracle-日志摘要" aria-label="Permalink to &quot;MySQL → Oracle 日志摘要&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">$</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=oracle</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-hostport=1521</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=system</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 源: mysql:rxthinkcmf.thinkphp8.elevue → 目标: oracle:rxthinkcmf.thinkphp8.elevue</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 待迁移 25 张表</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 目标库</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">rxthinkcmf</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已就绪</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库 完成(耗时 0ms)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构(25 张表)...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 为</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think_article</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 创建序列+触发器(自增列</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> id)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 为</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think_city</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 创建序列+触发器(自增列</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> id)</span></span>
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(其余含自增列的表类似)</span><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构 完成(耗时 2.1s),25 张表,118 个索引,0 个外键</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [1/25] 正在迁移 think_article...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_article</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +13(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 13)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_article</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> 共</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 13</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 45ms)</span></span>
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(Oracle</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> INSERT</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 耗时较</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> MySQL/SQLite</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 更长)...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据 完成(耗时 15m30s),共 785215 行</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 重置序列:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think_article_id_seq</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> →</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 14</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 重置序列:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think_city_id_seq</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> →</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 783563</span></span>
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(其余序列类似)</span><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列 完成(耗时 180ms)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验...</span></span>
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(25</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 张表全部</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> PASS)...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验 完成(耗时 820ms),25 张表全部 PASS</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移完成</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 成功:785215 行 / 25 张表 / 总耗时 15m33s</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">Oracle 迁移要点</p><ul><li><strong>建库</strong>:Oracle 通过 <code>CREATE USER</code> 创建用户,库名即用户名,需要 DBA 权限</li><li><strong>自增列</strong>:自动创建序列(<code>_seq</code>)和触发器(<code>_trg</code>),插入时自动填充</li><li><strong>序列重置</strong>:迁移完成后通过 <code>ALTER SEQUENCE ... RESTART</code> 重置到 MAX+1</li><li><strong>分页</strong>:使用 <code>ROW_NUMBER() OVER (ORDER BY 主键)</code> 保证稳定排序</li><li><strong>字段名</strong>:Oracle 默认大写,工具自动处理大小写转换</li></ul></div><h3 id="MySQL-→-SQLite-日志摘要" tabindex="-1">MySQL → SQLite 日志摘要 <a class="header-anchor" href="#MySQL-→-SQLite-日志摘要" aria-label="Permalink to &quot;MySQL → SQLite 日志摘要&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">$</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=sqlite</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=runtime/rxthinkcmf.thinkphp8.elevue.db</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 源: mysql:rxthinkcmf.thinkphp8.elevue → 目标: sqlite:runtime/rxthinkcmf.thinkphp8.elevue.db</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 待迁移 25 张表</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 目标库</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">runtime/rxthinkcmf.thinkphp8.elevue.db</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已就绪</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库 完成(耗时 0ms)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构(25 张表)...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构 完成(耗时 1s),25 张表,118 个索引,0 个外键</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据...</span></span>
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(SQLite</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 写入速度最快)...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据 完成(耗时 9m44s),共 785235 行</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 当前驱动</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> (sqlite) 无需重置序列,跳过</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列 完成(耗时 0ms)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验...</span></span>
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(25</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 张表全部</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> PASS)...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验 完成(耗时 427ms),25 张表全部 PASS</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移完成</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 成功:785235 行 / 25 张表 / 总耗时 9m46s</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span></code></pre></div><h3 id="只迁移指定表日志" tabindex="-1">只迁移指定表日志 <a class="header-anchor" href="#只迁移指定表日志" aria-label="Permalink to &quot;只迁移指定表日志&quot;">​</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">$</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-hostport=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=pgsql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-hostport=5432</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=postgres</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --tables=think_user,think_role,think_menu</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 源: mysql:rxthinkcmf.thinkphp8.elevue → 目标: pgsql:rxthinkcmf.thinkphp8.elevue</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 待迁移 3 张表</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 目标库</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已就绪</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库 完成(耗时 0ms)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构(3 张表)...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已删除目标表:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think_user</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已删除目标表:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think_role</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已删除目标表:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think_menu</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构 完成(耗时 85ms),3 张表,5 个索引,0 个外键</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据...</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [1/3] 正在迁移 think_user...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_user</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +22(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 22)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_user</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> 共</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 22</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 9ms)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [2/3] 正在迁移 think_role...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_role</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +24(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 24)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_role</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> 共</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 24</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 5ms)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [3/3] 正在迁移 think_menu...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_menu</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +228(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 228)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_menu</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> 共</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 228</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 12ms)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据 完成(耗时 30ms),共 274 行</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列 完成(耗时 25ms)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_user</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">22</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">22</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_role</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">24</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">24</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_menu</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">228</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">228</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验 完成(耗时 60ms),3 张表全部 PASS</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移完成</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 成功:274 行 / 3 张表 / 总耗时 250ms</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span></code></pre></div><h2 id="类型映射" tabindex="-1">类型映射 <a class="header-anchor" href="#类型映射" aria-label="Permalink to &quot;类型映射&quot;">​</a></h2><table tabindex="0"><thead><tr><th>源类型</th><th>MySQL</th><th>PostgreSQL</th><th>SqlServer</th><th>Oracle</th><th>SQLite</th></tr></thead><tbody><tr><td>bigint</td><td>bigint</td><td>bigint</td><td>bigint</td><td>NUMBER(19)</td><td>INTEGER</td></tr><tr><td>int</td><td>int</td><td>integer</td><td>int</td><td>NUMBER(10)</td><td>INTEGER</td></tr><tr><td>smallint</td><td>smallint</td><td>smallint</td><td>smallint</td><td>NUMBER(5)</td><td>INTEGER</td></tr><tr><td>tinyint</td><td>tinyint</td><td>smallint</td><td>tinyint</td><td>NUMBER(3)</td><td>INTEGER</td></tr><tr><td>decimal</td><td>decimal</td><td>numeric</td><td>decimal</td><td>NUMBER</td><td>REAL</td></tr><tr><td>float</td><td>float</td><td>real</td><td>float</td><td>BINARY_FLOAT</td><td>REAL</td></tr><tr><td>double</td><td>double</td><td>double precision</td><td>float</td><td>BINARY_DOUBLE</td><td>REAL</td></tr><tr><td>varchar</td><td>varchar</td><td>varchar</td><td>nvarchar</td><td>VARCHAR2</td><td>TEXT</td></tr><tr><td>char</td><td>char</td><td>char</td><td>nchar</td><td>CHAR</td><td>TEXT</td></tr><tr><td>text</td><td>text</td><td>text</td><td>ntext</td><td>CLOB</td><td>TEXT</td></tr><tr><td>blob</td><td>blob</td><td>bytea</td><td>varbinary</td><td>BLOB</td><td>BLOB</td></tr><tr><td>datetime</td><td>datetime</td><td>timestamp</td><td>datetime</td><td>TIMESTAMP</td><td>TEXT</td></tr><tr><td>timestamp</td><td>timestamp</td><td>timestamp</td><td>datetime</td><td>TIMESTAMP</td><td>TEXT</td></tr><tr><td>date</td><td>date</td><td>date</td><td>date</td><td>DATE</td><td>TEXT</td></tr><tr><td>boolean</td><td>tinyint(1)</td><td>boolean</td><td>bit</td><td>NUMBER(1)</td><td>INTEGER</td></tr><tr><td>json</td><td>json</td><td>jsonb</td><td>ntext</td><td>CLOB</td><td>TEXT</td></tr></tbody></table><div class="tip custom-block"><p class="custom-block-title">精度保留</p><ul><li><code>decimal(10,2)</code> → PostgreSQL <code>numeric(10,2)</code>(精度不丢失)</li><li><code>datetime(3)</code> → PostgreSQL <code>timestamp(3)</code>(毫秒精度保留)</li><li><code>enum(&#39;a&#39;,&#39;b&#39;,&#39;c&#39;)</code> → PostgreSQL <code>varchar</code> + <code>CHECK (col IN (&#39;a&#39;,&#39;b&#39;,&#39;c&#39;))</code>(候选值保留)</li></ul></div><h2 id="各驱动特殊处理" tabindex="-1">各驱动特殊处理 <a class="header-anchor" href="#各驱动特殊处理" aria-label="Permalink to &quot;各驱动特殊处理&quot;">​</a></h2><table tabindex="0"><thead><tr><th>驱动</th><th>建库方式</th><th>分页排序</th><th>自增语法</th><th>索引</th><th>外键</th><th>字段注释</th><th>表注释</th><th>collation</th><th>序列重置</th></tr></thead><tbody><tr><td>MySQL</td><td><code>CREATE DATABASE ... COLLATE</code></td><td>主键 <code>ORDER BY</code></td><td><code>AUTO_INCREMENT</code></td><td>✅</td><td>✅</td><td>✅ <code>COMMENT</code></td><td>✅</td><td>✅ 库/表/列</td><td>跳过</td></tr><tr><td>PostgreSQL</td><td><code>LC_COLLATE</code></td><td>主键 <code>ORDER BY</code></td><td><code>GENERATED BY DEFAULT AS IDENTITY</code></td><td>✅</td><td>✅</td><td>✅ <code>COMMENT ON COLUMN</code></td><td>✅</td><td>✅ 库/列</td><td>✅ <code>setval</code></td></tr><tr><td>SQL Server</td><td><code>COLLATE</code></td><td>主键 <code>ORDER BY</code></td><td><code>IDENTITY(1,1)</code></td><td>✅</td><td>✅</td><td>✅ <code>sp_addextendedproperty</code></td><td>✅</td><td>✅ 库级</td><td>✅ <code>DBCC CHECKIDENT</code></td></tr><tr><td>Oracle</td><td><code>CREATE USER</code> + <code>GRANT</code></td><td><code>ROW_NUMBER()</code></td><td>序列+触发器</td><td>✅</td><td>✅</td><td>✅ <code>COMMENT ON COLUMN</code></td><td>✅</td><td>❌</td><td>✅ <code>ALTER SEQUENCE</code></td></tr><tr><td>SQLite</td><td>自动创建文件</td><td>主键 <code>ORDER BY</code></td><td><code>INTEGER PRIMARY KEY AUTOINCREMENT</code></td><td>✅</td><td>✅</td><td>❌</td><td>❌</td><td>❌</td><td>跳过</td></tr></tbody></table><h2 id="PostgreSQL-特殊处理" tabindex="-1">PostgreSQL 特殊处理 <a class="header-anchor" href="#PostgreSQL-特殊处理" aria-label="Permalink to &quot;PostgreSQL 特殊处理&quot;">​</a></h2><h3 id="建库" tabindex="-1">建库 <a class="header-anchor" href="#建库" aria-label="Permalink to &quot;建库&quot;">​</a></h3><p>迁移到 PostgreSQL 时,工具会自动连接 <code>postgres</code> 维护库执行:</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 创建目标数据库(UTF-8 编码)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 若数据库已存在则跳过</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- LC_COLLATE / LC_CTYPE:仅当源与目标驱动相同时,从源库读取 collation 并应用</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CREATE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> DATABASE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &quot;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">数据库名</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">&quot; </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">WITH</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> ENCODING</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">UTF8</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">PgSQL 数据库不存在的判定</p><p>PostgreSQL 数据库不存在时返回的 SQLSTATE 可能是 <code>3D000</code>(明确不存在)或 <code>08006</code>(连接异常,中文环境下错误信息可能乱码)。工具会主动连接 <code>postgres</code> 维护库查询 <code>pg_database</code> 确认目标库是否真的不存在,避免误判。</p></div><h3 id="序列重置" tabindex="-1">序列重置 <a class="header-anchor" href="#序列重置" aria-label="Permalink to &quot;序列重置&quot;">​</a></h3><p>迁移完成后,对每张有自增主键的表分两步重置序列:</p><div class="language-php vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">php</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 第一步:通过 pg_get_serial_sequence() 获取列关联的实际序列名</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 兼容 serial(序列名如 table_id_seq)和 IDENTITY(序列名由系统自动生成)两种风格</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">seqName</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> $</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">dstPdo</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-&gt;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">query</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span></span>
<span class="line"><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SELECT</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> pg_get_serial_sequence(&#39;表名&#39;, &#39;字段名&#39;) </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">AS</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> s</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">)</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-&gt;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">fetch</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">()[</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">s</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">];</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 第二步:查询当前最大值,将序列重置到 max+1</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// setval 的第三个参数 false 表示下一个 nextval 返回给定值</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">maxId</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> $</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">dstPdo</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-&gt;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">query</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span></span>
<span class="line"><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SELECT</span><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> COALESCE</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(</span><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">MAX</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">字段名</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">), </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">0</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">) </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">AS</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> m </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">FROM</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">表名</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\&quot;</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">)</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-&gt;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">fetch</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">()[</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">m</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">];</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">dstPdo</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-&gt;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">exec</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SELECT</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> setval(</span><span style="--shiki-dark:#E7EE98;--shiki-light:#999999;">{</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B56959;">quotedSeq</span><span style="--shiki-dark:#E7EE98;--shiki-light:#999999;">}</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">, </span><span style="--shiki-dark:#E7EE98;--shiki-light:#999999;">{</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B56959;">maxId</span><span style="--shiki-dark:#E7EE98;--shiki-light:#999999;">}</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> +</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">, false)</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">);</span></span></code></pre></div><h2 id="SQL-Server-特殊处理" tabindex="-1">SQL Server 特殊处理 <a class="header-anchor" href="#SQL-Server-特殊处理" aria-label="Permalink to &quot;SQL Server 特殊处理&quot;">​</a></h2><h3 id="建库-1" tabindex="-1">建库 <a class="header-anchor" href="#建库-1" aria-label="Permalink to &quot;建库&quot;">​</a></h3><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 连接 master 库,创建目标数据库</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- COLLATE:仅当源与目标驱动相同时,从源库读取 collation 并应用</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CREATE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> DATABASE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [数据库名]</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">SQL Server &quot;登录失败&quot;的判定</p><p>SQL Server 数据库不存在时返回 SQLSTATE <code>28000</code> 并提示&quot;登录失败&quot;,容易与密码错误混淆。工具会尝试连接 <code>master</code> 库验证凭据:若 master 连接成功说明凭据正确、是数据库不存在;若 master 也失败则为密码错误。</p></div><h3 id="自增列迁移" tabindex="-1">自增列迁移 <a class="header-anchor" href="#自增列迁移" aria-label="Permalink to &quot;自增列迁移&quot;">​</a></h3><p>数据迁移时自动处理 <code>IDENTITY_INSERT</code>:</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 迁移前开启(允许显式写入自增列的值)</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SET</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> IDENTITY_INSERT [表名] </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">ON</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 批量 INSERT ...</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 迁移后关闭</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SET</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> IDENTITY_INSERT [表名] </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">OFF</span></span></code></pre></div><h3 id="序列重置-1" tabindex="-1">序列重置 <a class="header-anchor" href="#序列重置-1" aria-label="Permalink to &quot;序列重置&quot;">​</a></h3><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 重置标识种子到指定值,下一次插入自动加一</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 第一个参数:表名(带方括号)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 第三个参数:RESEED 值(当前最大 ID)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">DBCC CHECKIDENT (</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">[表名]</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">, RESEED, {$maxId})</span></span></code></pre></div><h2 id="Oracle-特殊处理" tabindex="-1">Oracle 特殊处理 <a class="header-anchor" href="#Oracle-特殊处理" aria-label="Permalink to &quot;Oracle 特殊处理&quot;">​</a></h2><h3 id="建库-2" tabindex="-1">建库 <a class="header-anchor" href="#建库-2" aria-label="Permalink to &quot;建库&quot;">​</a></h3><p>Oracle 的&quot;建库&quot;实际上是创建用户并授权。工具自动连接 Oracle 实例(默认服务名 <code>XE</code>),执行:</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 创建用户(库名即用户名,密码与连接密码一致)</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CREATE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> USER</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &quot;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">用户名</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">&quot; IDENTIFIED </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">BY</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">密码</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> DEFAULT</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> TABLESPACE USERS;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 授权:CONNECT(连接)、RESOURCE(建表等基础对象操作)</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">GRANT</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> CONNECT</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">, </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RESOURCE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> TO</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">用户名</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">;</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">Oracle 连接串</p><p>Oracle 的 DSN 格式为 <code>oci:dbname=//host:port/service_name</code>,其中 <code>service_name</code> 默认为 <code>XE</code>(Express Edition)。生产环境需根据实际的 Oracle 服务名修改,可通过 <code>lsnrctl status</code> 查看。</p></div><h3 id="自增列" tabindex="-1">自增列 <a class="header-anchor" href="#自增列" aria-label="Permalink to &quot;自增列&quot;">​</a></h3><p>Oracle 没有原生自增语法,工具自动创建序列+触发器实现等效功能:</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 创建序列(从 1 开始,每次递增 1,不缓存)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 序列名规则:表名_列名_SEQ(大写)</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CREATE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> SEQUENCE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &quot;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">TABLE_ID_SEQ</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">&quot; </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">START</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> WITH</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> INCREMENT </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">BY</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> NOCACHE;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 创建触发器(插入前自动取序列值填充自增列)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 触发器名规则:表名_列名_TRG(大写)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- IF :NEW.COL IS NULL 判断:允许显式传值,仅当未指定时才自动取序列</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- :NEW 引用的列名必须大写且不带引号</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CREATE OR REPLACE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> TRIGGER</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &quot;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">TABLE_ID_TRG</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">&quot;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">BEFORE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> INSERT</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> ON</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">TABLE</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> FOR</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> EACH </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">ROW</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">BEGIN</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> IF</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> :</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">NEW</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">.</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">ID</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> IS</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> NULL</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> THEN</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> SELECT</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">TABLE_ID_SEQ</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">.NEXTVAL </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">INTO</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> :</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">NEW</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">.</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">ID</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> FROM</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> dual;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> END</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> IF</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">END</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">;</span></span></code></pre></div><h3 id="序列重置-2" tabindex="-1">序列重置 <a class="header-anchor" href="#序列重置-2" aria-label="Permalink to &quot;序列重置&quot;">​</a></h3><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 重置序列到 MAX(id)+1</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- ALTER SEQUENCE ... RESTART:将序列起点设置为指定值,下一次 nextval 返回该值</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">ALTER</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> SEQUENCE</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">TABLE_ID_SEQ</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> RESTART</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> START</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> WITH</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1234</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">;</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">Oracle 建库权限</p><p>Oracle 建库实际上是通过 <code>CREATE USER</code> + <code>GRANT CONNECT, RESOURCE</code> 创建用户。需要 DBA 权限或具有 CREATE USER 权限的账号。连接串中的服务名默认为 <code>XE</code>(Express Edition),正式环境需根据实际配置修改。</p></div><h2 id="驱动安装与环境配置" tabindex="-1">驱动安装与环境配置 <a class="header-anchor" href="#驱动安装与环境配置" aria-label="Permalink to &quot;驱动安装与环境配置&quot;">​</a></h2><p>迁移工具基于 PDO 直连数据库,各驱动需要对应的 PDO 扩展。XAMPP 默认只自带 MySQL、PostgreSQL 和 SQLite 驱动,SQL Server 和 Oracle 需手动安装。</p><p>运行以下命令检查已安装的驱动:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 检查已安装的 PDO 驱动(-m 列出扩展,findstr /i 不区分大小写过滤)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">D:\xampp8.2\php\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -m</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> |</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> /i</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> pdo</span></span></code></pre></div><h3 id="MySQL-XAMPP-默认自带-" tabindex="-1">MySQL(XAMPP 默认自带) <a class="header-anchor" href="#MySQL-XAMPP-默认自带-" aria-label="Permalink to &quot;MySQL(XAMPP 默认自带)&quot;">​</a></h3><p>无需额外操作。验证:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 检查 MySQL 驱动是否已加载</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">D:\xampp8.2\php\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -m</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> |</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span></span></code></pre></div><h3 id="PostgreSQL-XAMPP-默认自带-" tabindex="-1">PostgreSQL(XAMPP 默认自带) <a class="header-anchor" href="#PostgreSQL-XAMPP-默认自带-" aria-label="Permalink to &quot;PostgreSQL(XAMPP 默认自带)&quot;">​</a></h3><p>无需额外操作。验证:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 检查 PostgreSQL 驱动是否已加载</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">D:\xampp8.2\php\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -m</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> |</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> pgsql</span></span></code></pre></div><p>若未安装,编辑 <code>D:\xampp8.2\php\php.ini</code>,找到 <code>;extension=pdo_pgsql</code> 去掉分号启用。</p><h3 id="SQL-Server-需手动安装-" tabindex="-1">SQL Server(需手动安装) <a class="header-anchor" href="#SQL-Server-需手动安装-" aria-label="Permalink to &quot;SQL Server(需手动安装)&quot;">​</a></h3><p>XAMPP 默认不带 SQL Server 驱动,需要安装两个组件。</p><div class="warning custom-block"><p class="custom-block-title">先决条件</p><p>安装 ODBC 驱动前,系统需要 Microsoft Visual C++ Redistributable。大多数 Windows 已预装,如果安装失败,先安装它再重试。</p></div><p><strong>步骤 1:安装 Microsoft ODBC Driver for SQL Server</strong></p><p>这是底层通信组件,sqlsrv 扩展依赖它,必须安装。</p><ul><li>下载地址:<a href="https://learn.microsoft.com/zh-cn/sql/connect/odbc/download-odbc-driver-for-sql-server" target="_blank" rel="noreferrer">https://learn.microsoft.com/zh-cn/sql/connect/odbc/download-odbc-driver-for-sql-server</a></li><li>版本选择:推荐 ODBC Driver 18(最新),两者可与 17 并存</li><li>安装:下载 x64 版本的 <code>msodbcsql.msi</code>,双击按向导完成</li></ul><p><strong>步骤 2:下载 PHP 扩展 DLL</strong></p><p>从微软官方 GitHub 下载:</p><ul><li>下载地址(Releases 页面):<a href="https://github.com/Microsoft/msphpsql/releases" target="_blank" rel="noreferrer">https://github.com/Microsoft/msphpsql/releases</a></li><li>下载文件:<code>Windows_5.12.0RTW.zip</code></li></ul><p>解压后目录结构(平铺,无子目录):</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>Windows_5.12.0RTW/</span></span>
<span class="line"><span>├── php_pdo_sqlsrv_81_nts_x64.dll</span></span>
<span class="line"><span>├── php_pdo_sqlsrv_81_ts_x64.dll</span></span>
<span class="line"><span>├── php_pdo_sqlsrv_82_nts_x64.dll</span></span>
<span class="line"><span>├── php_pdo_sqlsrv_82_ts_x64.dll ← PHP 8.2 TS x64</span></span>
<span class="line"><span>├── php_pdo_sqlsrv_83_nts_x64.dll</span></span>
<span class="line"><span>├── php_pdo_sqlsrv_83_ts_x64.dll</span></span>
<span class="line"><span>├── php_sqlsrv_81_nts_x64.dll</span></span>
<span class="line"><span>├── php_sqlsrv_81_ts_x64.dll</span></span>
<span class="line"><span>├── php_sqlsrv_82_nts_x64.dll</span></span>
<span class="line"><span>├── php_sqlsrv_82_ts_x64.dll ← PHP 8.2 TS x64</span></span>
<span class="line"><span>├── php_sqlsrv_83_nts_x64.dll</span></span>
<span class="line"><span>├── php_sqlsrv_83_ts_x64.dll</span></span>
<span class="line"><span>└── ...(另有 x86 版本)</span></span></code></pre></div><p><strong>文件命名规则</strong>:<code>php_{驱动}_{PHP版本}_{线程安全}_{架构}.dll</code></p><ul><li>驱动:<code>sqlsrv</code> 或 <code>pdo_sqlsrv</code></li><li>PHP 版本:<code>81</code> / <code>82</code> / <code>83</code></li><li>线程安全:<code>ts</code>(Thread Safe)/ <code>nts</code>(Non-Thread Safe)</li><li>架构:<code>x64</code> / <code>x86</code></li></ul><p>将以下两个文件复制到 <code>D:\xampp8.2\php\ext\</code>:</p><ul><li><code>php_sqlsrv_82_ts_x64.dll</code></li><li><code>php_pdo_sqlsrv_82_ts_x64.dll</code></li></ul><div class="tip custom-block"><p class="custom-block-title">版本匹配(PHP 8.2 + TS + x64)</p><ul><li>PHP 版本:<code>82</code> = PHP 8.2</li><li>线程安全:XAMPP 默认 TS(运行 <code>php -v</code> 确认,输出含 <code>Thread Safety =&gt; enabled</code>)</li><li>架构:<code>x64</code>(64 位系统)</li></ul></div><p><strong>步骤 3:在 php.ini 中启用扩展</strong></p><p>编辑 <code>D:\xampp8.2\php\php.ini</code>(注意不是 <code>apache\bin\php.ini</code>):</p><ol><li>启用前置扩展:找到 <code>;extension=mbstring</code> 去掉分号(sqlsrv 依赖 mbstring)</li><li>在 mbstring 之后添加以下两行(文件名必须与 ext 目录中的实际文件一致):</li></ol><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; SQL Server PHP 扩展(必须在 mbstring 之后加载)</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">extension</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">php_sqlsrv_82_ts_x64.dll </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; SQL Server 核心驱动</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">extension</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">php_pdo_sqlsrv_82_ts_x64.dll </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; SQL Server PDO 驱动(迁移工具使用)</span></span></code></pre></div><ol start="3"><li>保存后重启 XAMPP 中的 Apache 服务(命令行验证无需重启 Apache,只需重新运行 php 命令)</li></ol><p><strong>步骤 4:验证安装</strong></p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 检查 SQL Server 驱动是否已加载(应看到 sqlsrv 和 pdo_sqlsrv 两行)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">D:\xampp8.2\php\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -m</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> |</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> sqlsrv</span></span></code></pre></div><p>应看到 <code>sqlsrv</code> 和 <code>pdo_sqlsrv</code> 两行输出。</p><h3 id="Oracle-需手动配置-" tabindex="-1">Oracle(需手动配置) <a class="header-anchor" href="#Oracle-需手动配置-" aria-label="Permalink to &quot;Oracle(需手动配置)&quot;">​</a></h3><p>XAMPP 8.2 已自带 <code>php_pdo_oci.dll</code>(位于 <code>D:\xampp8.2\php\ext\</code>)。迁移工具基于 PDO 连接数据库,需要 <code>pdo_oci</code> 扩展,只需安装 Oracle Instant Client 并在 php.ini 中启用 <code>pdo_oci</code> 即可。</p><p><strong>步骤 1:安装 Oracle Instant Client</strong></p><p>pdo_oci 扩展依赖 Oracle 客户端库,必须先安装。</p><ul><li>下载地址:<a href="https://www.oracle.com/database/technologies/instant-client/downloads.html" target="_blank" rel="noreferrer">https://www.oracle.com/database/technologies/instant-client/downloads.html</a></li><li>版本选择:下载 Basic Package,选择 x64 版本,推荐 19c(与 XAMPP 自带的 DLL 对应)</li><li>安装: <ol><li>下载 <code>instantclient-basic-windows.x64-19.20.0.0.0dbru.zip</code></li><li>解压到固定路径,如 <code>C:\oracle\instantclient_19_20</code>(⚠️ 避免空格与中文)</li><li>配置系统环境变量: <ul><li>将 <code>C:\oracle\instantclient_19_20</code> 添加到系统 <code>PATH</code></li><li>新建系统变量 <code>TNS_ADMIN</code> = <code>C:\oracle\instantclient_19_20</code>(可选,用于 tnsnames.ora)</li></ul></li><li>重启终端或重启电脑使环境变量生效</li></ol></li></ul><div class="warning custom-block"><p class="custom-block-title">安装 VC++ 运行库</p><p>Oracle Instant Client 19c 依赖 VC++ 2015-2022 Redistributable,缺少会导致 DLL 加载失败。 下载地址:<a href="https://aka.ms/vc14/vc_redist.x64.exe" target="_blank" rel="noreferrer">https://aka.ms/vc14/vc_redist.x64.exe</a></p></div><p><strong>步骤 2:在 php.ini 中启用扩展</strong></p><p>编辑 <code>D:\xampp8.2\php\php.ini</code>(注意不是 <code>apache\bin\php.ini</code>):</p><p>找到以下行:</p><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">;extension=pdo_oci ; Oracle PDO 驱动(默认被注释)</span></span></code></pre></div><p>去掉前面的分号,改为:</p><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">extension</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">pdo_oci </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 启用 Oracle PDO 驱动(迁移工具依赖此扩展)</span></span></code></pre></div><p>保存后重启 XAMPP(完全关闭再启动,不是只重启 Apache)。</p><p><strong>步骤 3:验证安装</strong></p><p>命令行验证:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 检查 pdo_oci 扩展是否已加载</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">D:\xampp8.2\php\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -m</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> |</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -i</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">pdo_oci</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 列出所有可用的 PDO 驱动(应包含 oci)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">D:\xampp8.2\php\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -r</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">print_r(PDO::getAvailableDrivers());</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span></code></pre></div><p>应看到 <code>pdo_oci</code> 输出,且 <code>PDO::getAvailableDrivers()</code> 返回的数组中包含 <code>oci</code>。</p><p>phpinfo() 验证:创建 <code>&lt;?php phpinfo(); ?&gt;</code> 放入 htdocs,浏览器访问后搜索 <code>pdo_oci</code>,能看到 PDO drivers 中有 <code>oci</code> 且 Oracle Instant Client 版本号显示即成功。</p><h3 id="SQLite-XAMPP-默认自带-" tabindex="-1">SQLite(XAMPP 默认自带) <a class="header-anchor" href="#SQLite-XAMPP-默认自带-" aria-label="Permalink to &quot;SQLite(XAMPP 默认自带)&quot;">​</a></h3><p>无需额外操作。验证:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 检查 SQLite 驱动是否已加载</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">D:\xampp8.2\php\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -m</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> |</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> sqlite</span></span></code></pre></div><h3 id="驱动安装速查表" tabindex="-1">驱动安装速查表 <a class="header-anchor" href="#驱动安装速查表" aria-label="Permalink to &quot;驱动安装速查表&quot;">​</a></h3><table tabindex="0"><thead><tr><th>驱动</th><th>XAMPP 默认</th><th>安装方式</th><th>验证命令</th></tr></thead><tbody><tr><td>pdo_mysql</td><td>✅ 自带</td><td>无需安装</td><td><code>php -m | findstr mysql</code></td></tr><tr><td>pdo_pgsql</td><td>✅ 自带</td><td>php.ini 启用</td><td><code>php -m | findstr pgsql</code></td></tr><tr><td>pdo_sqlsrv</td><td>❌ 需安装</td><td>ODBC 驱动 + PECL 扩展</td><td><code>php -m | findstr sqlsrv</code></td></tr><tr><td>pdo_oci</td><td>⚠️ DLL 自带,需启用</td><td>InstantClient + VC++ 运行库 + php.ini 启用</td><td><code>php -m | findstr pdo_oci</code></td></tr><tr><td>pdo_sqlite</td><td>✅ 自带</td><td>无需安装</td><td><code>php -m | findstr sqlite</code></td></tr></tbody></table><h2 id="相关代码" tabindex="-1">相关代码 <a class="header-anchor" href="#相关代码" aria-label="Permalink to &quot;相关代码&quot;">​</a></h2><table tabindex="0"><thead><tr><th>文件</th><th>说明</th></tr></thead><tbody><tr><td><code>app/command/DbMigrateCommand.php</code></td><td>CLI 命令入口(参数解析、退出码)</td></tr><tr><td><code>app/service/DbMigrateService.php</code></td><td>迁移引擎服务(连接、建库、建表、数据迁移、序列重置、行数校验)</td></tr><tr><td><code>app/service/DbSchemaBuilder.php</code></td><td>DDL 生成器(类型映射、CREATE TABLE / INDEX / FK / COMMENT 语句生成)</td></tr><tr><td><code>config/console.php</code></td><td>命令注册</td></tr></tbody></table><h2 id="注意事项" tabindex="-1">注意事项 <a class="header-anchor" href="#注意事项" aria-label="Permalink to &quot;注意事项&quot;">​</a></h2><div class="warning custom-block"><p class="custom-block-title">迁移前检查</p><ol><li>确保目标数据库用户有 CREATE TABLE / INSERT / CREATE INDEX / ALTER TABLE(外键)权限</li><li>PostgreSQL 迁移还需要 CREATE DATABASE 权限</li><li>SQL Server 迁移需要 sa 或有 CREATE DATABASE 权限的用户</li><li>Oracle 迁移需要 DBA 权限或具有 CREATE USER / CREATE SEQUENCE / CREATE TRIGGER 权限的账号</li><li><code>--drop-target-first</code> 会删除目标表的全部数据(含索引、外键和注释),请谨慎使用</li><li>大表迁移建议调大 <code>--batch-size</code>(如 5000)以提高效率</li><li>迁移过程中如遇中断,已提交的 <code>--batch-size</code> 批次数据不会回滚,建议使用 <code>--drop-target-first</code> 重试</li><li>含点号的数据库名(如 <code>rxthinkcmf.thinkphp8.elevue</code>)各驱动均已适配</li><li>索引、外键和注释在建表阶段同步迁移,使用 <code>--drop-target-first</code> 重建时会一并重建</li><li>外键约束在所有表创建后统一添加,避免引用顺序问题</li><li>命令退出码:成功返回 0,失败或行数校验未通过返回 1(可用于 CI/CD 判断)</li></ol></div><h2 id="常见问题" tabindex="-1">常见问题 <a class="header-anchor" href="#常见问题" aria-label="Permalink to &quot;常见问题&quot;">​</a></h2><h3 id="Q-迁移失败后如何重试-" tabindex="-1">Q: 迁移失败后如何重试? <a class="header-anchor" href="#Q-迁移失败后如何重试-" aria-label="Permalink to &quot;Q: 迁移失败后如何重试?&quot;">​</a></h3><p>A: 使用 <code>--drop-target-first</code> 选项重新执行,会先删除目标表再重建。</p><h3 id="Q-如何只迁移部分表-" tabindex="-1">Q: 如何只迁移部分表? <a class="header-anchor" href="#Q-如何只迁移部分表-" aria-label="Permalink to &quot;Q: 如何只迁移部分表?&quot;">​</a></h3><p>A: 使用 <code>--tables</code> 选项指定表名,逗号分隔:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ...</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --tables=think_user,think_role</span></span></code></pre></div><h3 id="Q-大表迁移很慢怎么办-" tabindex="-1">Q: 大表迁移很慢怎么办? <a class="header-anchor" href="#Q-大表迁移很慢怎么办-" aria-label="Permalink to &quot;Q: 大表迁移很慢怎么办?&quot;">​</a></h3><p>A: 调大 <code>--batch-size</code>,如 <code>--batch-size=5000</code>。默认 1000 行一批,增大批量可减少数据库交互次数。</p><h3 id="Q-目标库不存在会自动创建吗-" tabindex="-1">Q: 目标库不存在会自动创建吗? <a class="header-anchor" href="#Q-目标库不存在会自动创建吗-" aria-label="Permalink to &quot;Q: 目标库不存在会自动创建吗?&quot;">​</a></h3><p>A: 会。所有驱动(MySQL / PostgreSQL / SQL Server / Oracle / SQLite)在目标库不存在时都会自动创建,无需手动建库。建库时会自动从源库读取 collation 并应用(仅当源与目标驱动相同时)。</p><h3 id="Q-PostgreSQL-报-SQLSTATE-08006-错误怎么办-" tabindex="-1">Q: PostgreSQL 报 SQLSTATE 08006 错误怎么办? <a class="header-anchor" href="#Q-PostgreSQL-报-SQLSTATE-08006-错误怎么办-" aria-label="Permalink to &quot;Q: PostgreSQL 报 SQLSTATE 08006 错误怎么办?&quot;">​</a></h3><p>A: <code>08006</code> 是连接异常的通用错误码,在中文环境下错误信息可能乱码。工具会主动连接 <code>postgres</code> 维护库查询 <code>pg_database</code> 确认目标库是否不存在。如果确认不存在会自动建库;如果维护库也连不上,请检查 PostgreSQL 服务是否启动、端口是否正确、密码是否正确。</p><h3 id="Q-SQL-Server-报-登录失败-怎么办-" tabindex="-1">Q: SQL Server 报&quot;登录失败&quot;怎么办? <a class="header-anchor" href="#Q-SQL-Server-报-登录失败-怎么办-" aria-label="Permalink to &quot;Q: SQL Server 报&quot;登录失败&quot;怎么办?&quot;">​</a></h3><p>A: SQL Server 数据库不存在时会返回&quot;登录失败&quot;(SQLSTATE 28000),工具会自动连接 <code>master</code> 库验证凭据并区分。如果确实是密码错误,请检查 <code>--dst-password</code>。</p><h3 id="Q-索引、外键、注释、默认值会迁移吗-" tabindex="-1">Q: 索引、外键、注释、默认值会迁移吗? <a class="header-anchor" href="#Q-索引、外键、注释、默认值会迁移吗-" aria-label="Permalink to &quot;Q: 索引、外键、注释、默认值会迁移吗?&quot;">​</a></h3><p>A: 会。迁移工具在建表阶段会同步迁移以下元数据:</p><ul><li><strong>索引</strong>:自动读取源表的非主键索引(UNIQUE / 普通 / 全文),在目标表创建后执行 <code>CREATE INDEX</code></li><li><strong>外键</strong>:自动读取源表的外键约束,在所有表创建后统一添加 <code>ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY</code>,避免引用顺序问题</li><li><strong>字段注释</strong>:MySQL 目标直接写入 <code>COMMENT</code> 子句;PostgreSQL / Oracle 使用 <code>COMMENT ON COLUMN</code>;SQL Server 使用 <code>sp_addextendedproperty</code></li><li><strong>表注释</strong>:MySQL 使用 <code>ALTER TABLE COMMENT</code>;PostgreSQL / Oracle 使用 <code>COMMENT ON TABLE</code></li><li><strong>默认值</strong>:完整保留,包括空字符串 <code>DEFAULT &#39;&#39;</code>、数值默认值、<code>CURRENT_TIMESTAMP</code>、<code>CURRENT_DATE</code>、函数调用(如 <code>uuid_generate_v4()</code>)等</li><li><strong>enum/set</strong>:自动迁移候选值,生成 <code>CHECK</code> 约束</li><li><strong>decimal/datetime 精度</strong>:保留精度参数(如 <code>decimal(10,2)</code> → <code>numeric(10,2)</code>,<code>datetime(3)</code> → <code>timestamp(3)</code>)</li><li><strong>collation</strong>:建库时自动应用源库 collation(仅同驱动时);建表时迁移表级和列级 collation(MySQL / PostgreSQL)</li></ul><h3 id="Q-数据迁移的可靠性如何保证-" tabindex="-1">Q: 数据迁移的可靠性如何保证? <a class="header-anchor" href="#Q-数据迁移的可靠性如何保证-" aria-label="Permalink to &quot;Q: 数据迁移的可靠性如何保证?&quot;">​</a></h3><p>A: 迁移工具有以下保障机制:</p><ul><li><strong>事务保护</strong>:每个 <code>--batch-size</code>(默认 1000 行)为一个独立事务,提交后即生效;当前批次失败时回滚,已提交的历史批次不受影响</li><li><strong>稳定排序</strong>:分页查询基于主键列 <code>ORDER BY</code>,确保大表分批迁移不会漏行或重复</li><li><strong>退出码</strong>:命令成功返回 0,失败或行数校验未通过返回 1,可用于 CI/CD 自动化判断</li><li><strong>行数校验</strong>:迁移完成后逐表对比源和目标的行数,输出 PASS/FAIL</li></ul><h3 id="Q-Oracle-自增列如何处理-" tabindex="-1">Q: Oracle 自增列如何处理? <a class="header-anchor" href="#Q-Oracle-自增列如何处理-" aria-label="Permalink to &quot;Q: Oracle 自增列如何处理?&quot;">​</a></h3><p>A: Oracle 没有原生自增语法。迁移工具会自动为自增列创建序列(<code>CREATE SEQUENCE</code>)和触发器(<code>CREATE TRIGGER</code>),实现等效的自增功能。</p><h3 id="Q-含点号的数据库名支持吗-" tabindex="-1">Q: 含点号的数据库名支持吗? <a class="header-anchor" href="#Q-含点号的数据库名支持吗-" aria-label="Permalink to &quot;Q: 含点号的数据库名支持吗?&quot;">​</a></h3><p>A: 支持。如 <code>rxthinkcmf.thinkphp8.elevue</code> 这类含点号的库名,各驱动均已适配。</p><h3 id="Q-SQLite-作为目标有什么限制-" tabindex="-1">Q: SQLite 作为目标有什么限制? <a class="header-anchor" href="#Q-SQLite-作为目标有什么限制-" aria-label="Permalink to &quot;Q: SQLite 作为目标有什么限制?&quot;">​</a></h3><p>A: SQLite 不支持字段注释、表注释和 collation。迁移完成后数据完整,索引和外键正常迁移。</p></div></div></main><footer class="VPDocFooter" data-v-e6f2a212 data-v-1bcd8184><!--[--><!--]--><div class="edit-info" data-v-1bcd8184><div class="edit-link" data-v-1bcd8184><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://gitee.com/rxthinkcmf/RXThinkCMF_ThinkPhp8_EleVue" target="_blank" rel="noreferrer" data-v-1bcd8184><!--[--><span class="vpi-square-pen edit-link-icon" data-v-1bcd8184></span> 对本页提出修改建议<!--]--></a></div><!----></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-1bcd8184><span class="visually-hidden" id="doc-footer-aria-label" data-v-1bcd8184>Pager</span><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link prev" href="/zh/tools/file-components.html" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>上一页</span><span class="title" data-v-1bcd8184>7.5 前端文件组件</span><!--]--></a></div><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link next" href="/zh/api-spec/response.html" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>下一页</span><span class="title" data-v-1bcd8184>8.1 统一响应格式</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-d8b57b2d data-v-566314d4><div class="container" data-v-566314d4><p class="message" data-v-566314d4>小蚂蚁云团队 · 提供技术支持</p><p class="copyright" data-v-566314d4>Copyright © 2018~2026 www.rxthink.cn. All rights reserved.</p></div></footer><!--[--><!--]--></div></div>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"404.md\":\"DnXdkDqR\",\"index.md\":\"L7EF19d9\",\"readme.md\":\"Dc96kdRW\",\"zh_api-spec_dict-api.md\":\"BzvYMmQG\",\"zh_api-spec_error-code.md\":\"DZ1CrMO8\",\"zh_api-spec_overview.md\":\"CK-OeLss\",\"zh_api-spec_pagination.md\":\"Bo7Ef76-\",\"zh_api-spec_response.md\":\"LEqkcTMS\",\"zh_api-spec_token.md\":\"jMkJ5xgQ\",\"zh_api-spec_upload.md\":\"CH_6kQML\",\"zh_appendix_api-cheatsheet.md\":\"D87VO31-\",\"zh_appendix_components.md\":\"BZnsoVqM\",\"zh_appendix_config-reference.md\":\"B6EqUS-b\",\"zh_appendix_database-tables.md\":\"CuiZIXU0\",\"zh_appendix_enums.md\":\"CkvyY7GT\",\"zh_appendix_faq.md\":\"COwfiwYP\",\"zh_appendix_functions.md\":\"CGQtr08x\",\"zh_appendix_glossary.md\":\"DR2jkbOj\",\"zh_appendix_middleware.md\":\"CmbJWEbW\",\"zh_appendix_stores.md\":\"Dh_hF39k\",\"zh_architecture_backend-layer.md\":\"BZ5R8HPk\",\"zh_architecture_base-classes.md\":\"uc2FGZ_j\",\"zh_architecture_cache.md\":\"BOw_8G_U\",\"zh_architecture_cross-cutting.md\":\"vc1kRYiE\",\"zh_architecture_database-design.md\":\"DjJWDg6F\",\"zh_architecture_directory-design.md\":\"BM2YdUmT\",\"zh_architecture_extensibility.md\":\"QZ84R2i9\",\"zh_architecture_frontend-layer.md\":\"DGBdkFzX\",\"zh_architecture_overview.md\":\"DetfYU6G\",\"zh_architecture_request-flow.md\":\"D0BsQMGR\",\"zh_architecture_security.md\":\"Iqt-Ebwd\",\"zh_changelog.md\":\"Drokr7z3\",\"zh_core_attributes.md\":\"DeNMX0Z4\",\"zh_core_auth-flow.md\":\"BThny9jG\",\"zh_core_captcha.md\":\"BSgUR5ec\",\"zh_core_config.md\":\"BaqCBguN\",\"zh_core_cors.md\":\"Dh5Ib53O\",\"zh_core_data-scope.md\":\"BOydYtLz\",\"zh_core_demo-mode.md\":\"D2vNiwmZ\",\"zh_core_dict-guide.md\":\"Bdxky3Ho\",\"zh_core_dict.md\":\"DsClLDyn\",\"zh_core_exception.md\":\"BUYcfedi\",\"zh_core_idempotent.md\":\"Og1MEyZ3\",\"zh_core_jwt.md\":\"D2TavJa5\",\"zh_core_login-log.md\":\"Dmm4xVWZ\",\"zh_core_operation-log.md\":\"DiMhJXDh\",\"zh_core_param.md\":\"BL-GPRt2\",\"zh_core_password.md\":\"WTfXkxK9\",\"zh_core_rbac.md\":\"CuhCwgwf\",\"zh_core_tenant.md\":\"CQg_N2UO\",\"zh_course.md\":\"X_N_H0Xc\",\"zh_deploy_backend.md\":\"CJvAhMQo\",\"zh_deploy_backup.md\":\"8bztHaYf\",\"zh_deploy_checklist.md\":\"BZ3M7C_u\",\"zh_deploy_ci-cd.md\":\"BRWcT7CB\",\"zh_deploy_db-migrate.md\":\"CHH-WTK7\",\"zh_deploy_docker.md\":\"C78JXVtA\",\"zh_deploy_env-plan.md\":\"DRKpus9J\",\"zh_deploy_frontend.md\":\"BrGHU1F8\",\"zh_deploy_performance.md\":\"DRGl6LxH\",\"zh_deploy_security.md\":\"CqsiMOpt\",\"zh_deploy_troubleshooting.md\":\"C61X44ME\",\"zh_directory.md\":\"CD7lVMIO\",\"zh_faq.md\":\"BYKIm3Ca\",\"zh_frontend_api-module.md\":\"kQ5EaZBv\",\"zh_frontend_directory.md\":\"BUirGLbE\",\"zh_frontend_display-components.md\":\"Ca7MwgHG\",\"zh_frontend_env-config.md\":\"B-VkgtJk\",\"zh_frontend_excel-components.md\":\"BFbfTaUo\",\"zh_frontend_form-components.md\":\"ByEz0UuS\",\"zh_frontend_http.md\":\"DedzD4EJ\",\"zh_frontend_i18n.md\":\"PsutjFMx\",\"zh_frontend_layout.md\":\"Dh0nlAcl\",\"zh_frontend_login.md\":\"Dkp6BYpW\",\"zh_frontend_new-page.md\":\"Px3UjLwl\",\"zh_frontend_overview.md\":\"mBjnZShT\",\"zh_frontend_permission.md\":\"zqzI9BfH\",\"zh_frontend_router.md\":\"D8QFo_kK\",\"zh_frontend_store.md\":\"z9sk_Uwh\",\"zh_frontend_style.md\":\"CX6kP24j\",\"zh_frontend_utils.md\":\"DhHK_RMH\",\"zh_generator_cli.md\":\"Dwtxs8pc\",\"zh_generator_code-engine.md\":\"CXRuWIHz\",\"zh_generator_config.md\":\"BmLwY9ZN\",\"zh_generator_demo.md\":\"Bl9RCUrJ\",\"zh_generator_faq.md\":\"Byk-CMbK\",\"zh_generator_overview.md\":\"YUs40sI_\",\"zh_generator_parser.md\":\"Dyidax8H\",\"zh_generator_templates.md\":\"ch4XrEDi\",\"zh_generator_web-ui.md\":\"C9039zMB\",\"zh_guide_code-list.md\":\"JJTI-waS\",\"zh_guide_controller.md\":\"B3mcOAa-\",\"zh_guide_database.md\":\"DjsE5XOJ\",\"zh_guide_faq.md\":\"CCrcIy_p\",\"zh_guide_frontend-integration.md\":\"DmS20w0l\",\"zh_guide_logic.md\":\"B_PfGiwh\",\"zh_guide_model.md\":\"DHkU7EAm\",\"zh_guide_overview.md\":\"C5OyGWBL\",\"zh_guide_permission.md\":\"bjP9Fqiv\",\"zh_guide_route.md\":\"UZ6FkdKT\",\"zh_guide_validator.md\":\"BkbaSS6W\",\"zh_introduction.md\":\"DxvKO4du\",\"zh_modules_article.md\":\"BXsydoGy\",\"zh_modules_category.md\":\"B5Gj7rN0\",\"zh_modules_city.md\":\"BhtDw6n8\",\"zh_modules_content.md\":\"BuvJMAXR\",\"zh_modules_dept.md\":\"CGqctAiD\",\"zh_modules_filetemplate.md\":\"kWi6iDKt\",\"zh_modules_index.md\":\"DvKrh8b3\",\"zh_modules_job.md\":\"D49eZjCP\",\"zh_modules_level.md\":\"DBxSBy0k\",\"zh_modules_menu.md\":\"DWuKGLC2\",\"zh_modules_param.md\":\"_zgPjMmj\",\"zh_modules_position.md\":\"B_57MtnP\",\"zh_modules_role.md\":\"CIbbOvQn\",\"zh_modules_tenant.md\":\"DqsIRMEg\",\"zh_modules_user.md\":\"oiyHINGQ\",\"zh_other_contributing.md\":\"Cn38e9t6\",\"zh_other_declare.md\":\"DcbcZmrU\",\"zh_other_sponsor.md\":\"ATS7Udz-\",\"zh_quickstart_backend-start.md\":\"B-niRhti\",\"zh_quickstart_database-init.md\":\"CjBgp0lX\",\"zh_quickstart_docker.md\":\"h9zc5Rpr\",\"zh_quickstart_env-vars.md\":\"CRDwk5l1\",\"zh_quickstart_environment.md\":\"Cu4OcYe2\",\"zh_quickstart_faq.md\":\"BcVRUTKH\",\"zh_quickstart_first-api.md\":\"C3sEiyn-\",\"zh_quickstart_frontend-start.md\":\"vB_5coGa\",\"zh_standards_api-response.md\":\"Di-uTKI6\",\"zh_standards_backend-code.md\":\"d2uVUR0z\",\"zh_standards_code-review.md\":\"DjZ5o7Ff\",\"zh_standards_deletion.md\":\"D-c_Rj1e\",\"zh_standards_frontend-code.md\":\"BUh8hNLV\",\"zh_standards_git.md\":\"DmaSsCtY\",\"zh_standards_pagination.md\":\"C-ZXANxf\",\"zh_tech-stack.md\":\"uGzFSBPV\",\"zh_tools_db-migrate.md\":\"DSxjRdYV\",\"zh_tools_excel.md\":\"-pcVPp2S\",\"zh_tools_file-components.md\":\"BcyIWLMs\",\"zh_tools_rich-text.md\":\"Gjwkfhnl\",\"zh_tools_upload-config.md\":\"GM-5GMxq\",\"zh_tools_upload.md\":\"BKlLaf1t\",\"zh_why.md\":\"Yi5B431N\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"小蚂蚁云\",\"titleTemplate\":\"RXThinkCMF 开发文档\",\"description\":\"A VitePress site\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":\"light\",\"themeConfig\":{\"logo\":\"/logo.svg\",\"outline\":[2,3],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://gitee.com/rxthinkcmf/RXThinkCMF_ThinkPhp8_EleVue\"}],\"footer\":{\"copyright\":\"Copyright © 2018~2026 www.rxthink.cn. All rights reserved.\",\"message\":\"小蚂蚁云团队 · 提供技术支持\"},\"editLink\":{\"pattern\":\"https://gitee.com/rxthinkcmf/RXThinkCMF_ThinkPhp8_EleVue\",\"text\":\"对本页提出修改建议\"},\"search\":{\"provider\":\"local\"}},\"locales\":{\"root\":{\"label\":\"简体中文\",\"lang\":\"zh-CN\",\"link\":\"/\",\"description\":\"RXThinkCMF 企业级前后端分离后台管理系统 - ThinkPHP8 + Vue3 + ElementPlus\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"http://docs.thinkphp8.elevue.rxthink.cn\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"RXThinkCMF 企业级前后端分离后台管理系统 - ThinkPHP8 + Vue3 + ElementPlus\"}],[\"meta\",{\"property\":\"twitter:url\",\"content\":\"http://docs.thinkphp8.elevue.rxthink.cn\"}],[\"meta\",{\"property\":\"twitter:title\",\"content\":\"RXThinkCMF ThinkPHP8+ElementPlus 开发文档\"}],[\"meta\",{\"property\":\"twitter:description\",\"content\":\"RXThinkCMF 企业级前后端分离后台管理系统 - ThinkPHP8 + Vue3 + ElementPlus\"}],[\"script\",{},\"\\n var _hmt = _hmt || [];\\n (function() {\\n var hm = document.createElement(\\\"script\\\");\\n hm.src = \\\"https://hm.baidu.com/hm.js?09709f15864acfe85b0d8edd6dabcbbc\\\";\\n var s = document.getElementsByTagName(\\\"script\\\")[0];\\n s.parentNode.insertBefore(hm, s);\\n })();\\n \"]],\"themeConfig\":{\"editLink\":{\"pattern\":\"https://gitee.com/rxthinkcmf/RXThinkCMF_ThinkPhp8_EleVue\",\"text\":\"对本页提出修改建议\"},\"outline\":{\"label\":\"本页内容\"},\"docFooter\":{\"prev\":\"上一页\",\"next\":\"下一页\"},\"nav\":[{\"text\":\"官网\",\"link\":\"https://www.rxthink.cn\"},{\"text\":\"授权\",\"link\":\"https://www.rxthink.cn/goods/detail/2\"},{\"text\":\"部署文档\",\"items\":[{\"text\":\"RXThinkCMF混编版ThinkPHP6+Layui版本\",\"link\":\"http://docs.thinkphp6.layui.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP6+ElementPlus版本\",\"link\":\"http://docs.thinkphp6.elevue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP6+AntDesign版本\",\"link\":\"http://docs.thinkphp6.antdvue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP6+NaiveUI版本\",\"link\":\"http://docs.thinkphp6.naivevue.rxthink.cn\"},{\"text\":\"RXThinkCMF混编版ThinkPHP8+Layui版本\",\"link\":\"http://docs.thinkphp8.layui.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP8+ElementPlus版本\",\"link\":\"http://docs.thinkphp8.elevue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP8+AntDesign版本\",\"link\":\"http://docs.thinkphp8.antdvue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP8+NaiveUI版本\",\"link\":\"http://docs.thinkphp8.naivevue.rxthink.cn\"},{\"text\":\"RXThinkCMF混编版Laravel13+Layui版本\",\"link\":\"http://docs.laravel13.layui.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离Laravel13+ElementPlus版本\",\"link\":\"http://docs.laravel13.elevue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离Laravel13+AntDesign版本\",\"link\":\"http://docs.laravel13.antdvue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离Laravel13+NaiveUI版本\",\"link\":\"http://docs.laravel13.naivevue.rxthink.cn\"}]},{\"text\":\"在线演示\",\"items\":[{\"text\":\"RXThinkCMF混编版ThinkPHP6+Layui版本\",\"link\":\"http://manage.thinkphp6.layui.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP6+ElementPlus版本\",\"link\":\"http://manage.thinkphp6.elevue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP6+AntDesign版本\",\"link\":\"http://manage.thinkphp6.antdvue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP6+NaiveUI版本\",\"link\":\"http://manage.thinkphp6.naivevue.rxthink.cn\"},{\"text\":\"RXThinkCMF混编版ThinkPHP8+Layui版本\",\"link\":\"http://manage.thinkphp8.layui.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP8+ElementPlus版本\",\"link\":\"http://manage.thinkphp8.elevue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP8+AntDesign版本\",\"link\":\"http://manage.thinkphp8.antdvue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP8+NaiveUI版本\",\"link\":\"http://manage.thinkphp8.naivevue.rxthink.cn\"},{\"text\":\"RXThinkCMF混编版Laravel13+Layui版本\",\"link\":\"http://manage.laravel13.layui.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离Laravel13+ElementPlus版本\",\"link\":\"http://manage.laravel13.elevue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离Laravel13+AntDesign版本\",\"link\":\"http://manage.laravel13.antdvue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离Laravel13+NaiveUI版本\",\"link\":\"http://manage.laravel13.naivevue.rxthink.cn\"}]},{\"text\":\"广告赞助\",\"link\":\"/zh/other/sponsor.html\"},{\"text\":\"相关链接\",\"items\":[{\"text\":\"官方网站\",\"link\":\"https://www.rxthink.cn\"},{\"text\":\"Gitee 仓库\",\"link\":\"https://gitee.com/rxthinkcmf/RXThinkCMF_ThinkPhp8_EleVue\"},{\"text\":\"ThinkPHP 官网\",\"link\":\"https://www.thinkphp.cn/\"},{\"text\":\"Vue3 文档\",\"link\":\"https://cn.vuejs.org/\"},{\"text\":\"ElementPlus\",\"link\":\"https://element-plus.org/zh-CN/\"}]}],\"sidebar\":{\"/zh/\":[{\"text\":\"📖 1. 了解项目\",\"collapsed\":false,\"items\":[{\"text\":\"1.1 项目介绍\",\"link\":\"/zh/introduction.html\"},{\"text\":\"1.2 为什么选择我们\",\"link\":\"/zh/why.html\"},{\"text\":\"1.3 项目目录结构\",\"link\":\"/zh/directory.html\"},{\"text\":\"1.4 新手入门指南\",\"link\":\"/zh/course.html\"},{\"text\":\"1.5 技术栈说明\",\"link\":\"/zh/tech-stack.html\"},{\"text\":\"1.6 更新日志\",\"link\":\"/zh/changelog.html\"}]},{\"text\":\"🚀 2. 快速入门\",\"collapsed\":false,\"items\":[{\"text\":\"2.1 开发环境准备\",\"link\":\"/zh/quickstart/environment.html\"},{\"text\":\"2.2 后端服务启动\",\"link\":\"/zh/quickstart/backend-start.html\"},{\"text\":\"2.3 前端服务启动\",\"link\":\"/zh/quickstart/frontend-start.html\"},{\"text\":\"2.4 数据库初始化\",\"link\":\"/zh/quickstart/database-init.html\"},{\"text\":\"2.5 环境变量配置\",\"link\":\"/zh/quickstart/env-vars.html\"},{\"text\":\"2.6 第一个接口调试\",\"link\":\"/zh/quickstart/first-api.html\"},{\"text\":\"2.7 Docker 快速体验\",\"link\":\"/zh/quickstart/docker.html\"},{\"text\":\"2.8 常见问题 FAQ\",\"link\":\"/zh/quickstart/faq.html\"}]},{\"text\":\"🧪 3. 模块开发实战\",\"collapsed\":false,\"items\":[{\"text\":\"3.1 概述与目标\",\"link\":\"/zh/guide/overview.html\"},{\"text\":\"3.2 数据库建表\",\"link\":\"/zh/guide/database.html\"},{\"text\":\"3.3 模型层开发\",\"link\":\"/zh/guide/model.html\"},{\"text\":\"3.4 验证器开发\",\"link\":\"/zh/guide/validator.html\"},{\"text\":\"3.5 逻辑层开发\",\"link\":\"/zh/guide/logic.html\"},{\"text\":\"3.6 控制器开发\",\"link\":\"/zh/guide/controller.html\"},{\"text\":\"3.7 路由注册\",\"link\":\"/zh/guide/route.html\"},{\"text\":\"3.8 权限节点配置\",\"link\":\"/zh/guide/permission.html\"},{\"text\":\"3.9 前端联调指引\",\"link\":\"/zh/guide/frontend-integration.html\"},{\"text\":\"3.10 完整代码清单\",\"link\":\"/zh/guide/code-list.html\"},{\"text\":\"3.11 常见问题与排错\",\"link\":\"/zh/guide/faq.html\"}]},{\"text\":\"🏛️ 4. 架构设计\",\"collapsed\":false,\"items\":[{\"text\":\"4.1 整体架构概览\",\"link\":\"/zh/architecture/overview.html\"},{\"text\":\"4.2 请求处理链路\",\"link\":\"/zh/architecture/request-flow.html\"},{\"text\":\"4.3 后端分层架构\",\"link\":\"/zh/architecture/backend-layer.html\"},{\"text\":\"4.4 前端分层架构\",\"link\":\"/zh/architecture/frontend-layer.html\"},{\"text\":\"4.5 目录结构设计\",\"link\":\"/zh/architecture/directory-design.html\"},{\"text\":\"4.6 核心基类体系\",\"link\":\"/zh/architecture/base-classes.html\"},{\"text\":\"4.7 横切机制\",\"link\":\"/zh/architecture/cross-cutting.html\"},{\"text\":\"4.8 缓存架构设计\",\"link\":\"/zh/architecture/cache.html\"},{\"text\":\"4.9 数据库设计\",\"link\":\"/zh/architecture/database-design.html\"},{\"text\":\"4.10 安全架构设计\",\"link\":\"/zh/architecture/security.html\"},{\"text\":\"4.11 扩展性设计\",\"link\":\"/zh/architecture/extensibility.html\"}]},{\"text\":\"🔐 5. 核心功能\",\"collapsed\":false,\"items\":[{\"text\":\"认证与安全\",\"collapsed\":false,\"items\":[{\"text\":\"5.1 用户认证(JWT)\",\"link\":\"/zh/core/jwt.html\"},{\"text\":\"5.2 认证流程实战\",\"link\":\"/zh/core/auth-flow.html\"},{\"text\":\"5.3 验证码机制\",\"link\":\"/zh/core/captcha.html\"},{\"text\":\"5.4 权限管理(RBAC)\",\"link\":\"/zh/core/rbac.html\"},{\"text\":\"5.5 跨域资源共享\",\"link\":\"/zh/core/cors.html\"},{\"text\":\"5.6 密码加密服务\",\"link\":\"/zh/core/password.html\"},{\"text\":\"5.7 演示模式\",\"link\":\"/zh/core/demo-mode.html\"}]},{\"text\":\"数据与配置\",\"collapsed\":false,\"items\":[{\"text\":\"5.8 多租户隔离\",\"link\":\"/zh/core/tenant.html\"},{\"text\":\"5.9 数据权限\",\"link\":\"/zh/core/data-scope.html\"},{\"text\":\"5.10 字典模块\",\"link\":\"/zh/core/dict.html\"},{\"text\":\"5.11 字典配置与使用\",\"link\":\"/zh/core/dict-guide.html\"},{\"text\":\"5.12 系统配置管理\",\"link\":\"/zh/core/config.html\"},{\"text\":\"5.13 系统参数管理\",\"link\":\"/zh/core/param.html\"}]},{\"text\":\"日志与监控\",\"collapsed\":false,\"items\":[{\"text\":\"5.14 操作日志\",\"link\":\"/zh/core/operation-log.html\"},{\"text\":\"5.15 登录日志\",\"link\":\"/zh/core/login-log.html\"},{\"text\":\"5.16 异常与响应处理\",\"link\":\"/zh/core/exception.html\"}]},{\"text\":\"防护与治理\",\"collapsed\":false,\"items\":[{\"text\":\"5.17 防重复提交\",\"link\":\"/zh/core/idempotent.html\"}]},{\"text\":\"注解系统\",\"collapsed\":false,\"items\":[{\"text\":\"5.18 注解系统总览\",\"link\":\"/zh/core/attributes.html\"}]}]},{\"text\":\"📦 6. 业务模块\",\"collapsed\":false,\"items\":[{\"text\":\"6.1 用户管理\",\"link\":\"/zh/modules/user.html\"},{\"text\":\"6.2 角色管理\",\"link\":\"/zh/modules/role.html\"},{\"text\":\"6.3 菜单管理\",\"link\":\"/zh/modules/menu.html\"},{\"text\":\"6.4 部门管理\",\"link\":\"/zh/modules/dept.html\"},{\"text\":\"6.5 职级管理\",\"link\":\"/zh/modules/level.html\"},{\"text\":\"6.6 岗位管理\",\"link\":\"/zh/modules/position.html\"},{\"text\":\"6.7 文章管理\",\"link\":\"/zh/modules/article.html\"},{\"text\":\"6.8 公告与链接管理\",\"link\":\"/zh/modules/content.html\"},{\"text\":\"6.9 行政区划管理\",\"link\":\"/zh/modules/city.html\"},{\"text\":\"6.10 分类管理\",\"link\":\"/zh/modules/category.html\"},{\"text\":\"6.11 定时任务\",\"link\":\"/zh/modules/job.html\"},{\"text\":\"6.12 参数管理\",\"link\":\"/zh/modules/param.html\"},{\"text\":\"6.13 租户管理\",\"link\":\"/zh/modules/tenant.html\"},{\"text\":\"6.14 文件模板管理\",\"link\":\"/zh/modules/filetemplate.html\"},{\"text\":\"6.15 首页与个人中心\",\"link\":\"/zh/modules/index.html\"}]},{\"text\":\"🧰 7. 文件处理\",\"collapsed\":false,\"items\":[{\"text\":\"7.1 文件上传全流程\",\"link\":\"/zh/tools/upload.html\"},{\"text\":\"7.2 上传配置详解\",\"link\":\"/zh/tools/upload-config.html\"},{\"text\":\"7.3 富文本处理\",\"link\":\"/zh/tools/rich-text.html\"},{\"text\":\"7.4 数据导入导出\",\"link\":\"/zh/tools/excel.html\"},{\"text\":\"7.5 前端文件组件\",\"link\":\"/zh/tools/file-components.html\"},{\"text\":\"7.6 数据库迁移工具\",\"link\":\"/zh/tools/db-migrate.html\"}]},{\"text\":\"🔗 8. 接口规范与对接\",\"collapsed\":false,\"items\":[{\"text\":\"8.1 统一响应格式\",\"link\":\"/zh/api-spec/response.html\"},{\"text\":\"8.2 错误码对照表\",\"link\":\"/zh/api-spec/error-code.html\"},{\"text\":\"8.3 分页查询规范\",\"link\":\"/zh/api-spec/pagination.html\"},{\"text\":\"8.4 文件上传接口\",\"link\":\"/zh/api-spec/upload.html\"},{\"text\":\"8.5 字典数据接口\",\"link\":\"/zh/api-spec/dict-api.html\"},{\"text\":\"8.6 Token 使用说明\",\"link\":\"/zh/api-spec/token.html\"},{\"text\":\"8.7 API 接口总览\",\"link\":\"/zh/api-spec/overview.html\"}]},{\"text\":\"🖥️ 9. 前端开发\",\"collapsed\":false,\"items\":[{\"text\":\"工程基础\",\"collapsed\":false,\"items\":[{\"text\":\"9.1 前端工程概述\",\"link\":\"/zh/frontend/overview.html\"},{\"text\":\"9.2 目录结构详解\",\"link\":\"/zh/frontend/directory.html\"},{\"text\":\"9.3 环境与构建配置\",\"link\":\"/zh/frontend/env-config.html\"}]},{\"text\":\"核心机制\",\"collapsed\":false,\"items\":[{\"text\":\"9.4 HTTP 请求封装\",\"link\":\"/zh/frontend/http.html\"},{\"text\":\"9.5 路由与动态菜单\",\"link\":\"/zh/frontend/router.html\"},{\"text\":\"9.6 状态管理(Pinia)\",\"link\":\"/zh/frontend/store.html\"},{\"text\":\"9.7 权限控制\",\"link\":\"/zh/frontend/permission.html\"},{\"text\":\"9.8 登录流程\",\"link\":\"/zh/frontend/login.html\"}]},{\"text\":\"公共组件\",\"collapsed\":false,\"items\":[{\"text\":\"9.9 数据展示组件\",\"link\":\"/zh/frontend/display-components.html\"},{\"text\":\"9.10 数据录入组件\",\"link\":\"/zh/frontend/form-components.html\"},{\"text\":\"9.11 Excel 导入导出组件\",\"link\":\"/zh/frontend/excel-components.html\"}]},{\"text\":\"开发实践\",\"collapsed\":false,\"items\":[{\"text\":\"9.12 新增页面开发步骤\",\"link\":\"/zh/frontend/new-page.html\"},{\"text\":\"9.13 API 模块编写规范\",\"link\":\"/zh/frontend/api-module.html\"},{\"text\":\"9.14 样式与主题定制\",\"link\":\"/zh/frontend/style.html\"},{\"text\":\"9.15 布局系统\",\"link\":\"/zh/frontend/layout.html\"},{\"text\":\"9.16 工具函数\",\"link\":\"/zh/frontend/utils.html\"},{\"text\":\"9.17 国际化(i18n)\",\"link\":\"/zh/frontend/i18n.html\"}]}]},{\"text\":\"🔧 10. 代码生成器\",\"collapsed\":false,\"items\":[{\"text\":\"10.1 概述与架构\",\"link\":\"/zh/generator/overview.html\"},{\"text\":\"10.2 CLI 命令行使用\",\"link\":\"/zh/generator/cli.html\"},{\"text\":\"10.3 Web 管理界面\",\"link\":\"/zh/generator/web-ui.html\"},{\"text\":\"10.4 表结构解析引擎\",\"link\":\"/zh/generator/parser.html\"},{\"text\":\"10.5 代码生成引擎\",\"link\":\"/zh/generator/code-engine.html\"},{\"text\":\"10.6 自定义模板开发\",\"link\":\"/zh/generator/templates.html\"},{\"text\":\"10.7 配置文件详解\",\"link\":\"/zh/generator/config.html\"},{\"text\":\"10.8 实战案例\",\"link\":\"/zh/generator/demo.html\"},{\"text\":\"10.9 常见问题\",\"link\":\"/zh/generator/faq.html\"}]},{\"text\":\"⚙️ 11. 运维部署\",\"collapsed\":false,\"items\":[{\"text\":\"11.1 部署 Checklist\",\"link\":\"/zh/deploy/checklist.html\"},{\"text\":\"11.2 环境规划\",\"link\":\"/zh/deploy/env-plan.html\"},{\"text\":\"11.3 数据库迁移\",\"link\":\"/zh/deploy/db-migrate.html\"},{\"text\":\"11.4 后端部署\",\"link\":\"/zh/deploy/backend.html\"},{\"text\":\"11.5 前端部署\",\"link\":\"/zh/deploy/frontend.html\"},{\"text\":\"11.6 Docker 生产部署\",\"link\":\"/zh/deploy/docker.html\"},{\"text\":\"11.7 性能调优\",\"link\":\"/zh/deploy/performance.html\"},{\"text\":\"11.8 安全加固清单\",\"link\":\"/zh/deploy/security.html\"},{\"text\":\"11.9 备份与恢复\",\"link\":\"/zh/deploy/backup.html\"},{\"text\":\"11.10 故障排查手册\",\"link\":\"/zh/deploy/troubleshooting.html\"},{\"text\":\"11.11 CI/CD 流水线\",\"link\":\"/zh/deploy/ci-cd.html\"}]},{\"text\":\"📋 12. 规范标准\",\"collapsed\":false,\"items\":[{\"text\":\"⭐ 必须遵守\",\"collapsed\":false,\"items\":[{\"text\":\"12.1 API 响应规范\",\"link\":\"/zh/standards/api-response.html\"},{\"text\":\"12.2 分页查询规范\",\"link\":\"/zh/standards/pagination.html\"},{\"text\":\"12.3 Git 提交规范\",\"link\":\"/zh/standards/git.html\"}]},{\"text\":\"📌 建议遵守\",\"collapsed\":false,\"items\":[{\"text\":\"12.4 数据删除规范\",\"link\":\"/zh/standards/deletion.html\"},{\"text\":\"12.5 代码审查清单\",\"link\":\"/zh/standards/code-review.html\"},{\"text\":\"12.6 后端编码规范\",\"link\":\"/zh/standards/backend-code.html\"},{\"text\":\"12.7 前端编码规范\",\"link\":\"/zh/standards/frontend-code.html\"}]}]},{\"text\":\"📄 附录\",\"collapsed\":false,\"items\":[{\"text\":\"A. 常见问题汇总\",\"link\":\"/zh/appendix/faq.html\"},{\"text\":\"B. 数据库表结构速查\",\"link\":\"/zh/appendix/database-tables.html\"},{\"text\":\"C. 配置项速查\",\"link\":\"/zh/appendix/config-reference.html\"},{\"text\":\"D. 公共函数速查\",\"link\":\"/zh/appendix/functions.html\"},{\"text\":\"E. API 接口速查表\",\"link\":\"/zh/appendix/api-cheatsheet.html\"},{\"text\":\"F. 中间件执行顺序\",\"link\":\"/zh/appendix/middleware.html\"},{\"text\":\"G. 前端组件速查\",\"link\":\"/zh/appendix/components.html\"},{\"text\":\"H. 前端 Store 速查\",\"link\":\"/zh/appendix/stores.html\"},{\"text\":\"I. 前端 Enums 速查\",\"link\":\"/zh/appendix/enums.html\"},{\"text\":\"J. 术语表\",\"link\":\"/zh/appendix/glossary.html\"},{\"text\":\"K. 贡献指南\",\"link\":\"/zh/other/contributing.html\"},{\"text\":\"L. 免责声明\",\"link\":\"/zh/other/declare.html\"},{\"text\":\"M. 广告赞助\",\"link\":\"/zh/other/sponsor.html\"},{\"text\":\"N. 开源协议\",\"link\":\"https://gitee.com/rxthinkcmf/RXThinkCMF_ThinkPhp8_EleVue\"}]}]}}}},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
</body>
</html>