373 lines
12 KiB
Markdown
373 lines
12 KiB
Markdown
# 2.4 数据库初始化
|
||
|
||
:::tip 概述
|
||
本章指导您完成数据库的创建和 SQL 脚本导入。项目为每种数据库提供了独立的 SQL 脚本,存放在 `document/` 目录下按数据库类型分组。
|
||
:::
|
||
|
||
## SQL 脚本目录结构
|
||
|
||
```text
|
||
document/
|
||
├── mysql/
|
||
│ └── rxthinkcmf.thinkphp8.elevue.sql # MySQL 版本
|
||
├── postgresql/
|
||
│ └── rxthinkcmf.thinkphp8.elevue.sql # PostgreSQL 版本
|
||
├── sqlserver/
|
||
│ └── rxthinkcmf.thinkphp8.elevue.sql # SQL Server 版本
|
||
├── oracle/
|
||
│ └── rxthinkcmf.thinkphp8.elevue.sql # Oracle 版本
|
||
└── sqlite/
|
||
└── rxthinkcmf.thinkphp8.elevue.sql # SQLite 版本
|
||
```
|
||
|
||
各数据库脚本已针对对应的 SQL 语法做了适配,可直接导入使用,无需手动转换。
|
||
|
||
---
|
||
|
||
## MySQL 初始化
|
||
|
||
### 1. 创建数据库
|
||
|
||
```bash
|
||
# 连接 MySQL(-u root 以 root 用户,-p 交互式输入密码)
|
||
mysql -u root -p
|
||
```
|
||
|
||
```sql
|
||
-- 创建项目数据库
|
||
-- CHARACTER SET utf8mb4 → 支持 emoji 等四字节字符
|
||
-- COLLATE utf8mb4_general_ci → 不区分大小写的排序规则
|
||
CREATE DATABASE `rxthinkcmf.thinkphp8.elevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
|
||
EXIT;
|
||
```
|
||
|
||
### 2. 导入 SQL 脚本
|
||
|
||
```bash
|
||
# -----------------------------------------------------------------------------
|
||
# 导入 MySQL 专用初始化脚本
|
||
# -----------------------------------------------------------------------------
|
||
# -u root -proot → 数据库用户名和密码
|
||
# rxthinkcmf... → 目标数据库名
|
||
# < file.sql → 将 SQL 文件内容作为 mysql 命令的输入
|
||
mysql -u root -proot rxthinkcmf.thinkphp8.elevue < document/mysql/rxthinkcmf.thinkphp8.elevue.sql
|
||
```
|
||
|
||
:::tip 温馨提示
|
||
导入完成后,数据库中包含完整的表结构和初始数据(管理员账号、菜单、字典、城市数据等),可直接使用。
|
||
:::
|
||
|
||
### 3. 配置 .env
|
||
|
||
```ini
|
||
[DATABASE]
|
||
TYPE = mysql ; 数据库类型
|
||
HOSTNAME = 127.0.0.1 ; 数据库地址
|
||
DATABASE = rxthinkcmf.thinkphp8.elevue ; 数据库名
|
||
USERNAME = root ; 用户名
|
||
PASSWORD = root ; 密码
|
||
HOSTPORT = 3306 ; 端口
|
||
PREFIX = think_ ; 表前缀
|
||
```
|
||
|
||
---
|
||
|
||
## PostgreSQL 初始化
|
||
|
||
### 1. 创建数据库
|
||
|
||
```bash
|
||
# 以 postgres 系统用户身份进入 PostgreSQL 命令行
|
||
sudo -u postgres psql
|
||
```
|
||
|
||
```sql
|
||
-- 创建数据库用户(如已存在可跳过)
|
||
CREATE USER postgres WITH PASSWORD 'root';
|
||
|
||
-- 创建项目数据库
|
||
-- OWNER postgres → 指定数据库所有者
|
||
-- ENCODING 'UTF8' → 使用 UTF-8 编码
|
||
CREATE DATABASE "rxthinkcmf.thinkphp8.elevue" OWNER postgres ENCODING 'UTF8';
|
||
|
||
-- 授予用户对该数据库的所有权限
|
||
GRANT ALL PRIVILEGES ON DATABASE "rxthinkcmf.thinkphp8.elevue" TO postgres;
|
||
\q
|
||
```
|
||
|
||
### 2. 导入 SQL 脚本
|
||
|
||
```bash
|
||
# -----------------------------------------------------------------------------
|
||
# 导入 PostgreSQL 专用初始化脚本
|
||
# -----------------------------------------------------------------------------
|
||
# -U postgres → 连接用户
|
||
# -d ... → 目标数据库
|
||
# -f file.sql → 执行 SQL 文件
|
||
psql -U postgres -d rxthinkcmf.thinkphp8.elevue -f document/postgresql/rxthinkcmf.thinkphp8.elevue.sql
|
||
```
|
||
|
||
### 3. 配置 .env
|
||
|
||
```ini
|
||
[DATABASE]
|
||
TYPE = pgsql ; 数据库类型改为 pgsql
|
||
HOSTNAME = 127.0.0.1
|
||
DATABASE = rxthinkcmf.thinkphp8.elevue
|
||
USERNAME = postgres ; PostgreSQL 默认用户
|
||
PASSWORD = root
|
||
HOSTPORT = 5432 ; PostgreSQL 默认端口
|
||
PREFIX = think_
|
||
```
|
||
|
||
---
|
||
|
||
## SQLite 初始化
|
||
|
||
### 1. 创建数据库文件
|
||
|
||
```bash
|
||
# 安装 PHP 的 SQLite 扩展(如尚未安装)
|
||
sudo apt install php8.2-sqlite3
|
||
|
||
# 创建数据库文件存放目录(-p 参数:目录不存在时自动创建)
|
||
mkdir -p /www/api/runtime
|
||
|
||
# 创建空的 SQLite 数据库文件(touch 创建空文件)
|
||
touch /www/api/runtime/database.sqlite
|
||
```
|
||
|
||
### 2. 导入 SQL 脚本
|
||
|
||
```bash
|
||
# -----------------------------------------------------------------------------
|
||
# 导入 SQLite 专用初始化脚本
|
||
# -----------------------------------------------------------------------------
|
||
# sqlite3 → SQLite 命令行工具
|
||
# 数据库文件路径 → SQLite 数据库存储在单个文件中
|
||
# < file.sql → 将 SQL 文件作为输入执行
|
||
sqlite3 /www/api/runtime/database.sqlite < document/sqlite/rxthinkcmf.thinkphp8.elevue.sql
|
||
```
|
||
|
||
### 3. 配置 .env
|
||
|
||
```ini
|
||
[DATABASE]
|
||
TYPE = sqlite ; 数据库类型改为 sqlite
|
||
DATABASE = /www/api/runtime/database.sqlite ; SQLite 文件路径
|
||
PREFIX = think_
|
||
```
|
||
|
||
:::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.thinkphp8.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.thinkphp8.elevue -i document/sqlserver/rxthinkcmf.thinkphp8.elevue.sql
|
||
```
|
||
|
||
### 3. 配置 .env
|
||
|
||
```ini
|
||
[DATABASE]
|
||
TYPE = sqlsrv ; 数据库类型改为 sqlsrv
|
||
HOSTNAME = 127.0.0.1
|
||
DATABASE = rxthinkcmf.thinkphp8.elevue
|
||
USERNAME = sa ; SQL Server 默认管理员
|
||
PASSWORD = root
|
||
HOSTPORT = 1433 ; SQL Server 默认端口
|
||
PREFIX = think_
|
||
```
|
||
|
||
---
|
||
|
||
## 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_thinkphp8_elevue"
|
||
DATAFILE '/u01/oradata/rxthinkcmf_thinkphp8_elevue.dbf'
|
||
SIZE 100M AUTOEXTEND ON NEXT 100M;
|
||
|
||
-- 创建数据库用户
|
||
-- IDENTIFIED BY → 设置密码
|
||
-- DEFAULT TABLESPACE → 指定默认表空间
|
||
CREATE USER "root" IDENTIFIED BY "root"
|
||
DEFAULT TABLESPACE "rxthinkcmf_thinkphp8_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.thinkphp8.elevue.sql
|
||
```
|
||
|
||
### 3. 配置 .env
|
||
|
||
```ini
|
||
[DATABASE]
|
||
TYPE = oracle ; 数据库类型改为 oracle
|
||
HOSTNAME = 127.0.0.1
|
||
DATABASE = rxthinkcmf.thinkphp8.elevue
|
||
USERNAME = root
|
||
PASSWORD = root
|
||
HOSTPORT = 1521 ; Oracle 默认端口
|
||
PREFIX = think_
|
||
```
|
||
|
||
---
|
||
|
||
## 验证数据库
|
||
|
||
无论使用哪种数据库,都可以通过以下方式验证:
|
||
|
||
```bash
|
||
# 方式一:ThinkPHP 命令行(显示版本信息,验证框架可正常加载)
|
||
php think 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.thinkphp8.elevue -e "SELECT COUNT(*) FROM think_user;"
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# PostgreSQL:查询用户表记录数
|
||
# -----------------------------------------------------------------------------
|
||
# -c → 执行 SQL 命令
|
||
psql -U postgres -d rxthinkcmf.thinkphp8.elevue -c "SELECT COUNT(*) FROM think_user;"
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# SQLite:查询用户表记录数
|
||
# -----------------------------------------------------------------------------
|
||
sqlite3 /www/api/runtime/database.sqlite "SELECT COUNT(*) FROM think_user;"
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# SQL Server:查询用户表记录数
|
||
# -----------------------------------------------------------------------------
|
||
# -Q → 执行查询后退出
|
||
sqlcmd -S localhost -U sa -P root -d rxthinkcmf.thinkphp8.elevue -Q "SELECT COUNT(*) FROM think_user;"
|
||
|
||
# -----------------------------------------------------------------------------
|
||
# Oracle:查询用户表记录数(需先进入 SQL 命令行)
|
||
# -----------------------------------------------------------------------------
|
||
sqlplus root/root@localhost:1521/XE
|
||
SELECT COUNT(*) FROM think_user;
|
||
EXIT;
|
||
```
|
||
|
||
---
|
||
|
||
## 默认数据
|
||
|
||
导入完成后,系统包含以下初始数据:
|
||
|
||
| 数据 | 说明 |
|
||
|------|------|
|
||
| 管理员账号 | admin / 123456 |
|
||
| 默认角色 | 超级管理员(data_scope=1,全部数据权限) |
|
||
| 系统菜单 | 完整的菜单和权限节点数据 |
|
||
| 字典数据 | 性别、状态等基础字典 |
|
||
| 系统参数 | DEFAULT_PASSWORD 等系统参数 |
|
||
| 城市数据 | 全国行政区划数据 |
|
||
|
||
---
|
||
|
||
## 常见问题
|
||
|
||
### Q: 导入报错字符集问题(MySQL)
|
||
|
||
```bash
|
||
# --default-character-set=utf8mb4 → 指定字符集为 utf8mb4(支持 emoji)
|
||
mysql -u root -proot --default-character-set=utf8mb4 rxthinkcmf.thinkphp8.elevue < document/mysql/rxthinkcmf.thinkphp8.elevue.sql
|
||
```
|
||
|
||
### Q: 表已存在错误
|
||
|
||
```bash
|
||
# -----------------------------------------------------------------------------
|
||
# 先删除旧数据库再重建(⚠️ 会清空所有数据)
|
||
# -----------------------------------------------------------------------------
|
||
# DROP DATABASE IF EXISTS → 如果存在则删除
|
||
mysql -u root -proot -e "DROP DATABASE IF EXISTS \`rxthinkcmf.thinkphp8.elevue\`;"
|
||
|
||
# 创建数据库(指定字符集)
|
||
mysql -u root -proot -e "CREATE DATABASE \`rxthinkcmf.thinkphp8.elevue\` DEFAULT CHARACTER SET utf8mb4;"
|
||
|
||
# 重新导入 SQL
|
||
mysql -u root -proot rxthinkcmf.thinkphp8.elevue < document/mysql/rxthinkcmf.thinkphp8.elevue.sql
|
||
```
|
||
|
||
### Q: PostgreSQL 导入报错
|
||
|
||
确保使用 `document/postgresql/` 目录下的脚本,该脚本已针对 PostgreSQL 语法做了适配。
|
||
|
||
### Q: SQLite 文件权限问题
|
||
|
||
```bash
|
||
# 664 → owner/group 可读写,others 只读
|
||
chmod 664 /www/api/runtime/database.sqlite
|
||
|
||
# 修改文件所有者为 Web 服务器用户
|
||
chown www-data:www-data /www/api/runtime/database.sqlite
|
||
```
|