# 2.4 数据库初始化 :::tip 概述 本章指导您完成数据库的创建和 SQL 脚本导入。项目为每种数据库提供了独立的 SQL 脚本,存放在 `document/` 目录下按数据库类型分组。 ::: ## SQL 脚本目录结构 ```text document/ ├── mysql/ │ └── rxthinkcmf.thinkphp6.antdvue.sql # MySQL 版本 ├── postgresql/ │ └── rxthinkcmf.thinkphp6.antdvue.sql # PostgreSQL 版本 ├── sqlserver/ │ └── rxthinkcmf.thinkphp6.antdvue.sql # SQL Server 版本 ├── oracle/ │ └── rxthinkcmf.thinkphp6.antdvue.sql # Oracle 版本 └── sqlite/ └── rxthinkcmf.thinkphp6.antdvue.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.thinkphp6.antdvue` 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.thinkphp6.antdvue < document/mysql/rxthinkcmf.thinkphp6.antdvue.sql ``` :::tip 温馨提示 导入完成后,数据库中包含完整的表结构和初始数据(管理员账号、菜单、字典、城市数据等),可直接使用。 ::: ### 3. 配置 .env ```ini [DATABASE] TYPE = mysql ; 数据库类型 HOSTNAME = 127.0.0.1 ; 数据库地址 DATABASE = rxthinkcmf.thinkphp6.antdvue ; 数据库名 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.thinkphp6.antdvue" OWNER postgres ENCODING 'UTF8'; -- 授予用户对该数据库的所有权限 GRANT ALL PRIVILEGES ON DATABASE "rxthinkcmf.thinkphp6.antdvue" TO postgres; \q ``` ### 2. 导入 SQL 脚本 ```bash # ----------------------------------------------------------------------------- # 导入 PostgreSQL 专用初始化脚本 # ----------------------------------------------------------------------------- # -U postgres → 连接用户 # -d ... → 目标数据库 # -f file.sql → 执行 SQL 文件 psql -U postgres -d rxthinkcmf.thinkphp6.antdvue -f document/postgresql/rxthinkcmf.thinkphp6.antdvue.sql ``` ### 3. 配置 .env ```ini [DATABASE] TYPE = pgsql ; 数据库类型改为 pgsql HOSTNAME = 127.0.0.1 DATABASE = rxthinkcmf.thinkphp6.antdvue 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.thinkphp6.antdvue.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.thinkphp6.antdvue] 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.thinkphp6.antdvue -i document/sqlserver/rxthinkcmf.thinkphp6.antdvue.sql ``` ### 3. 配置 .env ```ini [DATABASE] TYPE = sqlsrv ; 数据库类型改为 sqlsrv HOSTNAME = 127.0.0.1 DATABASE = rxthinkcmf.thinkphp6.antdvue 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_thinkphp6_antdvue" DATAFILE '/u01/oradata/rxthinkcmf_thinkphp6_antdvue.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M; -- 创建数据库用户 -- IDENTIFIED BY → 设置密码 -- DEFAULT TABLESPACE → 指定默认表空间 CREATE USER "root" IDENTIFIED BY "root" DEFAULT TABLESPACE "rxthinkcmf_thinkphp6_antdvue"; -- 授权 -- 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.thinkphp6.antdvue.sql ``` ### 3. 配置 .env ```ini [DATABASE] TYPE = oracle ; 数据库类型改为 oracle HOSTNAME = 127.0.0.1 DATABASE = rxthinkcmf.thinkphp6.antdvue 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.thinkphp6.antdvue -e "SELECT COUNT(*) FROM think_user;" # ----------------------------------------------------------------------------- # PostgreSQL:查询用户表记录数 # ----------------------------------------------------------------------------- # -c → 执行 SQL 命令 psql -U postgres -d rxthinkcmf.thinkphp6.antdvue -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.thinkphp6.antdvue -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.thinkphp6.antdvue < document/mysql/rxthinkcmf.thinkphp6.antdvue.sql ``` ### Q: 表已存在错误 ```bash # ----------------------------------------------------------------------------- # 先删除旧数据库再重建(⚠️ 会清空所有数据) # ----------------------------------------------------------------------------- # DROP DATABASE IF EXISTS → 如果存在则删除 mysql -u root -proot -e "DROP DATABASE IF EXISTS \`rxthinkcmf.thinkphp6.antdvue\`;" # 创建数据库(指定字符集) mysql -u root -proot -e "CREATE DATABASE \`rxthinkcmf.thinkphp6.antdvue\` DEFAULT CHARACTER SET utf8mb4;" # 重新导入 SQL mysql -u root -proot rxthinkcmf.thinkphp6.antdvue < document/mysql/rxthinkcmf.thinkphp6.antdvue.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 ```