Files
rxthinkcmf-wiki/RXThinkCMF_Laravel13_NaiveVue/zh/quickstart/database-init.md
T
2026-10-08 17:50:29 +08:00

405 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
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.
# 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)。