# 2.5 数据库初始化 :::tip 概述 本章指导您完成数据库的创建和 SQL 脚本导入。项目为每种数据库提供了独立的 SQL 脚本,存放在 `document/` 目录下按数据库类型分组,可直接导入使用,无需手动转换。 ::: ## SQL 脚本目录结构 ```text document/ ├── mysql/ │ └── rxthinkcmf.laravel13.elevue.sql # MySQL 版本 ├── postgresql/ │ └── rxthinkcmf.laravel13.elevue.sql # PostgreSQL 版本 ├── sqlserver/ │ └── rxthinkcmf.laravel13.elevue.sql # SQL Server 版本 ├── oracle/ │ └── rxthinkcmf.laravel13.elevue.sql # Oracle 版本 └── sqlite/ └── rxthinkcmf.laravel13.elevue.sql # SQLite 版本 ``` 各数据库脚本已针对对应的 SQL 语法做了适配,包含完整的表结构(25 张业务表,`laravel_` 前缀)与初始数据。 :::warning 本项目未使用 Laravel 迁移建表 `database/migrations/` 目录为空,`php artisan migrate` 只会初始化迁移记录表,**不会创建业务表**。数据库结构与初始数据以 SQL 脚本为准,表前缀为 `laravel_`(对应 `.env` 中 `DB_PREFIX`)。 ::: --- ## MySQL 初始化 ### 1. 创建数据库 ```bash # 连接 MySQL(-u root 以 root 用户,-p 交互式输入密码) mysql -u root -p ``` ```sql -- 创建项目数据库 -- CHARACTER SET utf8mb4 → 支持 emoji 等四字节字符 -- COLLATE utf8mb4_general_ci → 不区分大小写的排序规则 CREATE DATABASE `rxthinkcmf.laravel13.elevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; EXIT; ``` ### 2. 导入 SQL 脚本 ```bash # ----------------------------------------------------------------------------- # 导入 MySQL 专用初始化脚本(约 226MB,耗时 1~3 分钟) # ----------------------------------------------------------------------------- # -u root -proot → 数据库用户名和密码 # rxthinkcmf... → 目标数据库名 # < file.sql → 将 SQL 文件内容作为 mysql 命令的输入 mysql -u root -proot rxthinkcmf.laravel13.elevue < document/mysql/rxthinkcmf.laravel13.elevue.sql ``` :::tip 温馨提示 - 使用 [2.8 Docker 快速体验](/zh/quickstart/docker.html) 时无需手动导入,MySQL 容器**首次启动自动执行**该脚本; - Windows PowerShell 不支持 `<` 重定向,可改用 CMD 执行,或在 Navicat / phpMyAdmin 中导入。 ::: ### 3. 配置 .env ```ini DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=rxthinkcmf.laravel13.elevue DB_USERNAME=root DB_PASSWORD=root DB_PREFIX=laravel_ # 必须保留,脚本中表均为 laravel_ 前缀 ``` --- ## PostgreSQL 初始化 ### 1. 创建数据库 ```bash # 以 postgres 系统用户身份进入 PostgreSQL 命令行 sudo -u postgres psql ``` ```sql -- 创建项目数据库 -- OWNER postgres → 指定数据库所有者 -- ENCODING 'UTF8' → 使用 UTF-8 编码 CREATE DATABASE "rxthinkcmf.laravel13.elevue" OWNER postgres ENCODING 'UTF8'; -- 授予用户对该数据库的所有权限 GRANT ALL PRIVILEGES ON DATABASE "rxthinkcmf.laravel13.elevue" TO postgres; \q ``` ### 2. 导入 SQL 脚本 ```bash # ----------------------------------------------------------------------------- # 导入 PostgreSQL 专用初始化脚本 # ----------------------------------------------------------------------------- # -U postgres → 连接用户 # -d ... → 目标数据库 # -f file.sql → 执行 SQL 文件 psql -U postgres -d rxthinkcmf.laravel13.elevue -f document/postgresql/rxthinkcmf.laravel13.elevue.sql ``` ### 3. 配置 .env ```ini DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 DB_DATABASE=rxthinkcmf.laravel13.elevue DB_USERNAME=postgres DB_PASSWORD=root DB_PREFIX=laravel_ ``` --- ## SQLite 初始化 ### 1. 创建数据库文件 ```bash # 安装 PHP 的 SQLite 扩展(如尚未安装) sudo apt install php8.3-sqlite3 # 创建数据库文件存放目录(-p 参数:目录不存在时自动创建) mkdir -p database # 创建空的 SQLite 数据库文件(touch 创建空文件) touch database/database.sqlite ``` ### 2. 导入 SQL 脚本 ```bash # ----------------------------------------------------------------------------- # 导入 SQLite 专用初始化脚本 # ----------------------------------------------------------------------------- # sqlite3 → SQLite 命令行工具 # 数据库文件路径 → SQLite 数据库存储在单个文件中 # < file.sql → 将 SQL 文件作为输入执行 sqlite3 database/database.sqlite < document/sqlite/rxthinkcmf.laravel13.elevue.sql ``` ### 3. 配置 .env ```ini DB_CONNECTION=sqlite # DB_DATABASE 指向 database/database.sqlite(Laravel 默认值,无需修改) DB_PREFIX=laravel_ ``` :::tip SQLite 特点 - 无需安装数据库服务器,数据存储在单个文件中 - 适合开发环境、小型项目或嵌入式场景 - 文件路径需确保 PHP 进程有读写权限 ::: --- ## SQL Server 初始化 ### 1. 创建数据库 ```bash # ----------------------------------------------------------------------------- # 使用 sqlcmd 创建数据库 # ----------------------------------------------------------------------------- # -S localhost → 服务器地址 # -U sa → 用户名(sa 为 SQL Server 管理员) # -P root → 密码 # -Q → 执行 SQL 查询后退出 # COLLATE Chinese_PRC_CI_AS → 中文排序规则(不区分大小写) sqlcmd -S localhost -U sa -P root -Q "CREATE DATABASE [rxthinkcmf.laravel13.elevue] COLLATE Chinese_PRC_CI_AS" ``` ### 2. 导入 SQL 脚本 ```bash # ----------------------------------------------------------------------------- # 导入 SQL Server 专用初始化脚本 # ----------------------------------------------------------------------------- # -d rxthinkcmf... → 目标数据库 # -i file.sql → 执行 SQL 文件 sqlcmd -S localhost -U sa -P root -d rxthinkcmf.laravel13.elevue -i document/sqlserver/rxthinkcmf.laravel13.elevue.sql ``` ### 3. 配置 .env ```ini DB_CONNECTION=sqlsrv DB_HOST=127.0.0.1 DB_PORT=1433 DB_DATABASE=rxthinkcmf.laravel13.elevue DB_USERNAME=sa DB_PASSWORD=root DB_PREFIX=laravel_ ``` --- ## Oracle 初始化 ### 1. 创建表空间和用户 ```sql -- 使用 sqlplus 连接 Oracle(system 为管理员用户,XE 为服务名) sqlplus system/root@localhost:1521/XE -- 创建表空间(Oracle 数据存储的逻辑单元) -- DATAFILE → 数据文件的物理路径 -- SIZE 100M → 初始大小 100MB -- AUTOEXTEND ON NEXT 100M → 空间不足时自动扩展 100MB CREATE TABLESPACE "rxthinkcmf_laravel13_elevue" DATAFILE '/u01/oradata/rxthinkcmf_laravel13_elevue.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M; -- 创建数据库用户 -- IDENTIFIED BY → 设置密码 -- DEFAULT TABLESPACE → 指定默认表空间 CREATE USER "root" IDENTIFIED BY "root" DEFAULT TABLESPACE "rxthinkcmf_laravel13_elevue"; -- 授权 -- CONNECT → 连接权限 -- RESOURCE → 创建表/视图等对象的权限 -- CREATE VIEW → 创建视图的权限 -- UNLIMITED TABLESPACE → 不限制表空间使用量 GRANT CONNECT, RESOURCE, CREATE VIEW TO "root"; GRANT UNLIMITED TABLESPACE TO "root"; EXIT; ``` ### 2. 导入 SQL 脚本 ```bash # ----------------------------------------------------------------------------- # 导入 Oracle 专用初始化脚本 # ----------------------------------------------------------------------------- # sqlplus → Oracle 命令行工具 # root/root@localhost:1521/XE → 用户/密码@主机:端口/服务名 # @file.sql → 执行 SQL 文件 sqlplus root/root@localhost:1521/XE @document/oracle/rxthinkcmf.laravel13.elevue.sql ``` ### 3. 配置 .env ```ini DB_CONNECTION=oracle DB_HOST=127.0.0.1 DB_PORT=1521 DB_DATABASE=rxthinkcmf.laravel13.elevue DB_USERNAME=root DB_PASSWORD=root DB_PREFIX=laravel_ ``` :::warning Oracle 前置条件与实现说明 - 需要 PHP 的 `pdo_oci` 扩展与 Oracle Instant Client,安装步骤见 [2.1 开发环境准备](/zh/quickstart/environment.html)「数据库安装 → Oracle」; - 项目已内置 Oracle 运行时驱动:`DB_CONNECTION=oracle` 即可连接(`AppServiceProvider` 注册 `oci` 自定义驱动,配套 `App\Support\Database\{OracleConnection, OracleGrammar, OracleProcessor}`,分页与自增主键回填已适配);切换时 `.env` 中 `DB_PORT` 改为 `1521`; - 表结构变更请使用跨库迁移工具 `php artisan db:migrate`(自动生成 Oracle 序列与触发器),不使用 Laravel 迁移; - 实际投产前请按业务场景完整验证(复杂查询、导入导出等)。 ::: --- ## 验证数据库 无论使用哪种数据库,都可以通过以下方式验证: ```bash # 方式一:框架命令行(能正常执行说明框架与数据库配置可加载) php artisan --version # 方式二:手动测试登录接口(POST 请求 + JSON 参数) curl http://localhost:8000/api/login -X POST \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"123456"}' ``` 各数据库直接查询验证: ```bash # ----------------------------------------------------------------------------- # MySQL:查询用户表记录数(验证表是否创建成功且有数据) # ----------------------------------------------------------------------------- # -e → 执行 SQL 后退出 mysql -u root -proot rxthinkcmf.laravel13.elevue -e "SELECT COUNT(*) FROM laravel_user;" # ----------------------------------------------------------------------------- # PostgreSQL:查询用户表记录数 # ----------------------------------------------------------------------------- # -c → 执行 SQL 命令 psql -U postgres -d rxthinkcmf.laravel13.elevue -c "SELECT COUNT(*) FROM laravel_user;" # ----------------------------------------------------------------------------- # SQLite:查询用户表记录数 # ----------------------------------------------------------------------------- sqlite3 database/database.sqlite "SELECT COUNT(*) FROM laravel_user;" # ----------------------------------------------------------------------------- # SQL Server:查询用户表记录数 # ----------------------------------------------------------------------------- # -Q → 执行查询后退出 sqlcmd -S localhost -U sa -P root -d rxthinkcmf.laravel13.elevue -Q "SELECT COUNT(*) FROM laravel_user;" # ----------------------------------------------------------------------------- # Oracle:查询用户表记录数(需先进入 SQL 命令行) # ----------------------------------------------------------------------------- sqlplus root/root@localhost:1521/XE SELECT COUNT(*) FROM laravel_user; EXIT; ``` 查询到记录数 > 0 即初始化成功。 --- ## 默认数据 导入完成后,系统包含以下初始数据: | 数据 | 说明 | |------|------| | 管理员账号 | admin / 123456(超级管理员,用户 ID=1) | | 租户演示账号 | tenant001 / 123456(客户租户A 租户管理员) | | 默认角色 | 超级管理员(全部数据权限) | | 部门与岗位 | 默认组织架构数据 | | 系统菜单 | 完整的菜单和权限节点数据 | | 字典数据 | 性别、状态等基础字典 | | 系统参数 | DEFAULT_PASSWORD 等系统参数 | | 系统配置 | 动态配置项 | | 城市数据 | 全国行政区划数据 | | 租户数据 | 平台租户与客户租户初始数据 | --- ## 常见问题 ### Q: 导入报错字符集问题(MySQL) ```bash # --default-character-set=utf8mb4 → 指定字符集为 utf8mb4(支持 emoji) mysql -u root -proot --default-character-set=utf8mb4 rxthinkcmf.laravel13.elevue < document/mysql/rxthinkcmf.laravel13.elevue.sql ``` ### Q: 报 `Table 'xxx.users' doesn't exist` A: `DB_PREFIX` 未配置或不匹配。脚本中的表均为 `laravel_` 前缀(如 `laravel_user`),确认 `.env` 中: ```ini DB_PREFIX=laravel_ ``` 修改后执行 `php artisan config:clear`。 ### Q: 报错提示表已存在 ```bash # ----------------------------------------------------------------------------- # 先删除旧数据库再重建(⚠️ 会清空所有数据) # ----------------------------------------------------------------------------- # DROP DATABASE IF EXISTS → 如果存在则删除 mysql -u root -proot -e "DROP DATABASE IF EXISTS \`rxthinkcmf.laravel13.elevue\`;" # 创建数据库(指定字符集) mysql -u root -proot -e "CREATE DATABASE \`rxthinkcmf.laravel13.elevue\` DEFAULT CHARACTER SET utf8mb4;" # 重新导入 SQL mysql -u root -proot rxthinkcmf.laravel13.elevue < document/mysql/rxthinkcmf.laravel13.elevue.sql ``` ### Q: 导入很慢或中断 脚本约 226MB(含全国行政区划等大数据量表),导入需 1~3 分钟属正常。确保命令行窗口保持打开直到导入完成;中断后按上一条清库重导。 ### Q: 使用了错误数据库类型的脚本 A: 请使用 `document/` 下**与你的数据库类型对应目录**中的脚本(如 MySQL 用 `document/mysql/`),脚本已按对应 SQL 语法适配,混用会报语法错误。 ### Q: `php artisan migrate` 后依然表不存在 正常现象——本项目 migrations 为空,`migrate` 不创建业务表,请按本章手动导入 SQL 脚本。 ### Q: SQLite 文件权限问题 ```bash # 664 → owner/group 可读写,others 只读 chmod 664 database/database.sqlite # 修改文件所有者为 Web 服务器用户 chown www-data:www-data database/database.sqlite ``` ### Q: 想把已有 MySQL 数据迁移到其他数据库 使用跨库迁移工具(结构 + 数据 + Oracle 序列自动处理),见 [7.6 数据库迁移工具](/zh/tools/db-migrate.html)。