Skip to content

Commit 4a4965a

Browse files
authored
feat: 增加数据初始化一键脚本
feat: 增加数据初始化一键脚本
2 parents 5830d14 + 87f9f1b commit 4a4965a

25 files changed

+1270
-0
lines changed

.github/workflows/dev_deploy.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ on:
1111
- dev
1212
paths-ignore:
1313
- 'readme.md'
14+
- 'script'
1415

1516
jobs:
1617
build_and_deploy:

.github/workflows/prod_deploy.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ on:
1111
- main
1212
paths-ignore:
1313
- 'readme.md'
14+
- 'script'
1415

1516
jobs:
1617
build_and_deploy:

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,8 @@ pip-log.txt
1515
pip-delete-this-directory.txt
1616
.DS_Store
1717

18+
# 数据库文件
19+
db.sqlite3
20+
1821
# 环境变量文件,开发时使用,生成部署时改为环境变量
1922
.env

db.sqlite3

-276 KB
Binary file not shown.

dbinit.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import script.dbinit

script/dbinit.py

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
import environ
2+
import os
3+
from pathlib import Path
4+
import sqlite3
5+
import re
6+
import pymysql
7+
8+
9+
env = environ.Env()
10+
BASE_DIR = Path(__file__).resolve().parent.parent
11+
environ.Env.read_env(os.path.join(BASE_DIR, ".env"))
12+
13+
# 检测环境文件是否存在以及DB_ENGINE是否存在
14+
if not os.path.exists(os.path.join(BASE_DIR, ".env")):
15+
print("环境文件不存在")
16+
exit()
17+
if not env("DB_ENGINE"):
18+
print("DB_ENGINE不存在")
19+
exit()
20+
21+
# 判断数据库类型
22+
DB_ENGINE = env("DB_ENGINE")
23+
24+
if DB_ENGINE == "sqlite3":
25+
# 判断是否存在db.sqlite3文件
26+
if not os.path.exists(os.path.join(BASE_DIR, "db.sqlite3")):
27+
# 创建db.sqlite3文件
28+
open(os.path.join(BASE_DIR, "db.sqlite3"), "w").close()
29+
# 若存在,询问是否需要删除并重新初始化
30+
if os.path.exists(os.path.join(BASE_DIR, "db.sqlite3")):
31+
if input("是否需要删除并重新初始化数据库?(y/n): ") == "y":
32+
os.remove(os.path.join(BASE_DIR, "db.sqlite3"))
33+
open(os.path.join(BASE_DIR, "db.sqlite3"), "w").close()
34+
else:
35+
print("数据库初始化失败")
36+
exit()
37+
38+
# 连接数据库
39+
connection = sqlite3.connect(os.path.join(BASE_DIR, "db.sqlite3"))
40+
41+
# 读取sql文件夹下的所有sql文件并执行
42+
sql_dir = os.path.join(BASE_DIR, "script", "sql")
43+
for file in os.listdir(sql_dir):
44+
print(f"正在处理:{file}")
45+
with open(os.path.join(sql_dir, file), "r") as f:
46+
sql_content = f.read()
47+
48+
# 提取创建表的SQL语句
49+
create_table_match = re.search(r'CREATE TABLE[^;]*;', sql_content, re.DOTALL | re.IGNORECASE)
50+
insert_data_match = re.search(r'INSERT INTO[^;]*;', sql_content, re.DOTALL | re.IGNORECASE)
51+
52+
# 执行创建表的SQL
53+
cursor = connection.cursor()
54+
try:
55+
if create_table_match:
56+
# 替换MySQL特有的语法为SQLite兼容语法
57+
create_sql = create_table_match.group(0)
58+
59+
# 删除ENGINE相关的语句
60+
create_sql = re.sub(r'ENGINE=.*?;', ';', create_sql)
61+
62+
# 正确处理SQLite的AUTOINCREMENT语法(应该是PRIMARY KEY AUTOINCREMENT)
63+
create_sql = create_sql.replace('AUTO_INCREMENT', '')
64+
create_sql = re.sub(r'`id`\s+bigint\s+NOT\s+NULL\s*,', '`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,', create_sql)
65+
create_sql = re.sub(r'`id`\s+INTEGER\s+NOT\s+NULL\s*,', '`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,', create_sql)
66+
create_sql = re.sub(r'`id`\s+int\s+NOT\s+NULL\s*,', '`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,', create_sql)
67+
68+
# 替换一些不兼容的数据类型
69+
create_sql = create_sql.replace('bigint', 'INTEGER')
70+
create_sql = create_sql.replace('tinyint(1)', 'BOOLEAN')
71+
create_sql = create_sql.replace('int', 'INTEGER')
72+
73+
# 移除UNIQUE KEY和KEY语句
74+
create_sql = re.sub(r',\s*UNIQUE KEY\s+`[^`]+`\s+\([^)]+\)', '', create_sql)
75+
create_sql = re.sub(r',\s*KEY\s+`[^`]+`\s+\([^)]+\)', '', create_sql)
76+
77+
# 移除CONSTRAINT相关内容
78+
create_sql = re.sub(r',\s*CONSTRAINT.*?REFERENCES.*?\)', '', create_sql)
79+
80+
# 移除PRIMARY KEY语句(因为我们已经在id字段添加了PRIMARY KEY)
81+
create_sql = re.sub(r',\s*PRIMARY KEY\s+\(`id`\)', '', create_sql)
82+
83+
print(f"执行创建表:{create_sql[:50]}...")
84+
cursor.execute(create_sql)
85+
connection.commit()
86+
87+
if insert_data_match:
88+
insert_sql = insert_data_match.group(0)
89+
print(f"执行插入数据:{insert_sql[:50]}...")
90+
cursor.execute(insert_sql)
91+
connection.commit()
92+
93+
except sqlite3.Error as e:
94+
print(f"执行SQL出错:{e}")
95+
continue
96+
finally:
97+
cursor.close()
98+
99+
connection.close()
100+
print("SQLite数据库初始化完成!")
101+
elif DB_ENGINE == "mysql":
102+
# 检验env内容是否完整
103+
if not env("DB_NAME"):
104+
print("DB_NAME不存在,请在.env文件中配置DB_NAME")
105+
exit()
106+
if not env("DB_USER"):
107+
print("DB_USER不存在,请在.env文件中配置DB_USER")
108+
exit()
109+
if not env("DB_PASSWORD"):
110+
print("DB_PASSWORD不存在,请在.env文件中配置DB_PASSWORD")
111+
exit()
112+
if not env("DB_HOST"):
113+
print("DB_HOST不存在,请在.env文件中配置DB_HOST")
114+
exit()
115+
116+
# 连接到MySQL数据库
117+
try:
118+
connection = pymysql.connect(
119+
host=env("DB_HOST"),
120+
user=env("DB_USER"),
121+
password=env("DB_PASSWORD"),
122+
database=env("DB_NAME")
123+
)
124+
cursor = connection.cursor()
125+
126+
# 读取sql文件夹下的所有sql文件并执行
127+
sql_dir = os.path.join(BASE_DIR, "script", "sql")
128+
for file in os.listdir(sql_dir):
129+
print(f"正在处理:{file}")
130+
with open(os.path.join(sql_dir, file), "r") as f:
131+
sql_content = f.read()
132+
133+
# 执行SQL语句
134+
try:
135+
for statement in sql_content.split(';'):
136+
if statement.strip():
137+
print(f"执行SQL:{statement[:50]}...")
138+
cursor.execute(statement)
139+
connection.commit()
140+
except pymysql.MySQLError as e:
141+
print(f"执行SQL出错:{e}")
142+
connection.rollback()
143+
continue
144+
145+
cursor.close()
146+
connection.close()
147+
print("MySQL数据库初始化完成!")
148+
149+
except pymysql.MySQLError as e:
150+
print(f"连接MySQL数据库出错:{e}")
151+
exit()
152+
153+
else:
154+
print("初始化脚本类型目前只支持sqlite3和mysql, 其余类型请自行执行sql文件(文件夹位置:script/sql)")
155+
exit()
156+
157+
158+
159+
160+
161+
162+

script/sql/puredrf_auth_group.sql

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
-- MySQL dump 10.13 Distrib 8.0.40, for macos14 (arm64)
2+
--
3+
-- Host: 47.243.254.174 Database: puredrf
4+
-- ------------------------------------------------------
5+
-- Server version 8.0.41-0ubuntu0.22.04.1
6+
7+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
8+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
9+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
10+
/*!50503 SET NAMES utf8 */;
11+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
12+
/*!40103 SET TIME_ZONE='+00:00' */;
13+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
14+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
15+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
16+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
17+
18+
--
19+
-- Table structure for table `auth_group`
20+
--
21+
22+
DROP TABLE IF EXISTS `auth_group`;
23+
/*!40101 SET @saved_cs_client = @@character_set_client */;
24+
/*!50503 SET character_set_client = utf8mb4 */;
25+
CREATE TABLE `auth_group` (
26+
`id` int NOT NULL AUTO_INCREMENT,
27+
`name` varchar(150) NOT NULL,
28+
PRIMARY KEY (`id`),
29+
UNIQUE KEY `name` (`name`)
30+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
31+
/*!40101 SET character_set_client = @saved_cs_client */;
32+
33+
--
34+
-- Dumping data for table `auth_group`
35+
--
36+
37+
LOCK TABLES `auth_group` WRITE;
38+
/*!40000 ALTER TABLE `auth_group` DISABLE KEYS */;
39+
/*!40000 ALTER TABLE `auth_group` ENABLE KEYS */;
40+
UNLOCK TABLES;
41+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
42+
43+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
44+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
45+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
46+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
47+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
48+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
49+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
50+
51+
-- Dump completed on 2025-05-02 13:45:52
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
-- MySQL dump 10.13 Distrib 8.0.40, for macos14 (arm64)
2+
--
3+
-- Host: 47.243.254.174 Database: puredrf
4+
-- ------------------------------------------------------
5+
-- Server version 8.0.41-0ubuntu0.22.04.1
6+
7+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
8+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
9+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
10+
/*!50503 SET NAMES utf8 */;
11+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
12+
/*!40103 SET TIME_ZONE='+00:00' */;
13+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
14+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
15+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
16+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
17+
18+
--
19+
-- Table structure for table `auth_group_permissions`
20+
--
21+
22+
DROP TABLE IF EXISTS `auth_group_permissions`;
23+
/*!40101 SET @saved_cs_client = @@character_set_client */;
24+
/*!50503 SET character_set_client = utf8mb4 */;
25+
CREATE TABLE `auth_group_permissions` (
26+
`id` bigint NOT NULL AUTO_INCREMENT,
27+
`group_id` int NOT NULL,
28+
`permission_id` int NOT NULL,
29+
PRIMARY KEY (`id`),
30+
UNIQUE KEY `auth_group_permissions_group_id_permission_id_0cd325b0_uniq` (`group_id`,`permission_id`),
31+
KEY `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` (`permission_id`),
32+
CONSTRAINT `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`),
33+
CONSTRAINT `auth_group_permissions_group_id_b120cbf9_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`)
34+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
35+
/*!40101 SET character_set_client = @saved_cs_client */;
36+
37+
--
38+
-- Dumping data for table `auth_group_permissions`
39+
--
40+
41+
LOCK TABLES `auth_group_permissions` WRITE;
42+
/*!40000 ALTER TABLE `auth_group_permissions` DISABLE KEYS */;
43+
/*!40000 ALTER TABLE `auth_group_permissions` ENABLE KEYS */;
44+
UNLOCK TABLES;
45+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
46+
47+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
48+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
49+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
50+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
51+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
52+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
53+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
54+
55+
-- Dump completed on 2025-05-02 13:46:15
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
-- MySQL dump 10.13 Distrib 8.0.40, for macos14 (arm64)
2+
--
3+
-- Host: 47.243.254.174 Database: puredrf
4+
-- ------------------------------------------------------
5+
-- Server version 8.0.41-0ubuntu0.22.04.1
6+
7+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
8+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
9+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
10+
/*!50503 SET NAMES utf8 */;
11+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
12+
/*!40103 SET TIME_ZONE='+00:00' */;
13+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
14+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
15+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
16+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
17+
18+
--
19+
-- Table structure for table `auth_permission`
20+
--
21+
22+
DROP TABLE IF EXISTS `auth_permission`;
23+
/*!40101 SET @saved_cs_client = @@character_set_client */;
24+
/*!50503 SET character_set_client = utf8mb4 */;
25+
CREATE TABLE `auth_permission` (
26+
`id` int NOT NULL AUTO_INCREMENT,
27+
`name` varchar(255) NOT NULL,
28+
`content_type_id` int NOT NULL,
29+
`codename` varchar(100) NOT NULL,
30+
PRIMARY KEY (`id`),
31+
UNIQUE KEY `auth_permission_content_type_id_codename_01ab375a_uniq` (`content_type_id`,`codename`),
32+
CONSTRAINT `auth_permission_content_type_id_2f476e4b_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`)
33+
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
34+
/*!40101 SET character_set_client = @saved_cs_client */;
35+
36+
--
37+
-- Dumping data for table `auth_permission`
38+
--
39+
40+
LOCK TABLES `auth_permission` WRITE;
41+
/*!40000 ALTER TABLE `auth_permission` DISABLE KEYS */;
42+
INSERT INTO `auth_permission` VALUES (1,'Can add permission',1,'add_permission'),(2,'Can change permission',1,'change_permission'),(3,'Can delete permission',1,'delete_permission'),(4,'Can view permission',1,'view_permission'),(5,'Can add group',2,'add_group'),(6,'Can change group',2,'change_group'),(7,'Can delete group',2,'delete_group'),(8,'Can view group',2,'view_group'),(9,'Can add log entry',3,'add_logentry'),(10,'Can change log entry',3,'change_logentry'),(11,'Can delete log entry',3,'delete_logentry'),(12,'Can view log entry',3,'view_logentry'),(13,'Can add content type',4,'add_contenttype'),(14,'Can change content type',4,'change_contenttype'),(15,'Can delete content type',4,'delete_contenttype'),(16,'Can view content type',4,'view_contenttype'),(17,'Can add session',5,'add_session'),(18,'Can change session',5,'change_session'),(19,'Can delete session',5,'delete_session'),(20,'Can view session',5,'view_session'),(21,'Can add user',6,'add_user'),(22,'Can change user',6,'change_user'),(23,'Can delete user',6,'delete_user'),(24,'Can view user',6,'view_user'),(25,'Can add 菜单/权限',7,'add_menu'),(26,'Can change 菜单/权限',7,'change_menu'),(27,'Can delete 菜单/权限',7,'delete_menu'),(28,'Can view 菜单/权限',7,'view_menu'),(29,'Can add Menu meta',8,'add_menumeta'),(30,'Can change Menu meta',8,'change_menumeta'),(31,'Can delete Menu meta',8,'delete_menumeta'),(32,'Can view Menu meta',8,'view_menumeta'),(33,'Can add 角色表',9,'add_role'),(34,'Can change 角色表',9,'change_role'),(35,'Can delete 角色表',9,'delete_role'),(36,'Can view 角色表',9,'view_role'),(37,'Can add 部门',10,'add_deptinfo'),(38,'Can change 部门',10,'change_deptinfo'),(39,'Can delete 部门',10,'delete_deptinfo'),(40,'Can view 部门',10,'view_deptinfo'),(41,'Can add 登录日志',11,'add_loginlog'),(42,'Can change 登录日志',11,'change_loginlog'),(43,'Can delete 登录日志',11,'delete_loginlog'),(44,'Can view 登录日志',11,'view_loginlog'),(45,'Can add 操作日志',12,'add_operationlog'),(46,'Can change 操作日志',12,'change_operationlog'),(47,'Can delete 操作日志',12,'delete_operationlog'),(48,'Can view 操作日志',12,'view_operationlog');
43+
/*!40000 ALTER TABLE `auth_permission` ENABLE KEYS */;
44+
UNLOCK TABLES;
45+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
46+
47+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
48+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
49+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
50+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
51+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
52+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
53+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
54+
55+
-- Dump completed on 2025-05-02 13:46:06

0 commit comments

Comments
 (0)