django项目添加测试数据的三种方式
文章目录
- 自定义终端命令
- Faker添加模拟数据
- 基于终端脚本来完成数据的添加
- 编写python脚本
- 编写shell脚本
- 执行脚本需要权限
- 使用shell命令来完成测试数据的添加
添加测试数据在工作中一共有三种方式:
- 可以根据django的manage.py指令进行[自定义终端命令]
- 可以采用第三方模块Faker来完成数据的模拟添加(Faker模块可以写在上面第一种方法里面)
- 可以使用python脚本或者shell脚本来完成
如果数据量不是很大,可以通过sql语句以及在数据库添加。
自定义终端命令
文档:https://docs.djangoproject.com/zh-hans/3.2/howto/custom-management-commands/
在子应用目录下添加一个 management/commands
包目录,然后这个commands里面处理__init__.py
以外其他文件的文件名将作为django-admin或者python manage.py的命令选项了。注意:文件名不能以_开头,否则不会被识别为命令。
接着我们可以在commands包下根据自己的业务需要,编写对应的命令。例如,我们现在需要在courses子应用下添加课程对应的测试数据,所以我们在courses下创建 management/commands
包目录,然后创建命令文件example.py,代码:
import constants
from django.core.management.base import BaseCommand, CommandError
from courses.models import Teacher
# 类名必须是Command而且一个文件就是一个命令类,这个命令类必须直接或间接继承BaseCommand
class Command(BaseCommand):
help = '添加课程相关的测试数据'
# 如果当前命令,需要接受来自终端的参数,可以使用add_arguments
def add_arguments(self, parser):
pass
# 位置参数,必填项
# parser.add_argument('name', nargs='+', type=int)
# 命令参数,可选项
# parser.add_argument(
# '--table',
# action='store_true',
# help='Delete poll instead of closing it',
# )
# 命令执行的核心方法,
def handle(self, *args, **options):
"""添加测试数据"""
print("添加测试数据")
Teacher.objects.create(
name="赵小明",
avatar="teacher/avatar.jpg",
role=1,
title="老师",
signature="从业3年,管理班级无数",
brief="从业3年,管理班级无数",
)
此时,执行python manage.py
可以看到course应用下已经有了相关的终端命令
Faker添加模拟数据
文档:https://faker.readthedocs.io/en/stable/locales/zh_CN.html#
github:https://github.com/joke2k/faker/
faker是一个在多个编程语言里面都比较常用的第三方工具类,它的作用就是可以提供非常有效的方式帮开发者生成一些模拟仿真的测试数据。
pip install faker
可以结合上面的自定义终端命令来实现,example.py,代码:
import constants,random
from django.core.management.base import BaseCommand, CommandError
from courses.models import Teacher
from faker import Faker
from django.conf import settings
# 类名必须是Command而且一个文件就是一个命令类,这个命令类必须直接或间接继承BaseCommand
class Command(BaseCommand):
help = '添加课程相关的测试数据'
# 如果当前命令,需要接受来自终端的参数,可以使用add_arguments
def add_arguments(self, parser):
# 位置参数,必填项
# parser.add_argument('date_type', nargs='+', type=int, help="添加数据的类型")
# 命令参数,可选项
parser.add_argument(
'--type',
dest='type',
default='teacher',
type=str,
help='测试数据的类型',
)
parser.add_argument(
'--number',
dest='number',
default=10,
type=int,
help='添加数据的数量',
)
# 命令执行的核心方法,
def handle(self, *args, **options):
"""添加课程相关的测试数据"""
if options["type"] == "teacher":
self.add_teacher(options)
elif options["type"] == "direction":
self.add_direction(options)
def add_teacher(self,options):
"""添加授课老师的测试数据"""
faker = Faker(["zh_CN"])
for i in range(options["number"]):
Teacher.objects.create(
name=faker.unique.name(), # 唯一的姓名
avatar="teacher/avatar.jpg",
role=random.randint(0,2),
title="老师",
signature= "从业3年,管理班级无数",
brief= f"从业3年,管理班级无数,联系电话:{faker.unique.phone_number()},邮箱地址:{faker.unique.company_email()}",
)
print("添加授课老师的测试数据完成....")
def add_direction(self,options):
"""添加学习方向的测试数据"""
print("添加学习方向的测试数据完成....")
终端下调用:
cd ~/Desktop/luffycity/luffycityapi
python manage.py example
python manage.py example --type=teacher
python manage.py example --type=direction
python manage.py example --type=teacher --number=10
基于终端脚本来完成数据的添加
要编写一个python或者shell脚本,就要清楚一件事情,就是我们可以根据对应的语言来编写对应的终端代码,但是必须在首行的位置声明执行这些代码的解析器是谁?路径在哪里?
可以通过whereis python
或者whereis bash
得到python解释器或者bash的路径
当脚本中需要用到某些库时,就要确保首行路径环境中已经下载
编写python脚本
首行指定运行当前代码的python解释器。写完整绝对路径。
test1.py,代码:
#! /home/jack/anaconda3/envs/luffycity/bin/python
# 首行以后的代码必须要符合python的语法
"""
针对通用代码的运行,可以直接使用系统内置的全局环境的python解释器,也可以使用虚拟环境的解析器
#! /usr/bin/python3
如果这个代码需要调用对应的第三方模块,那么就要写上安装该模块的python解释器
#! /home/moluo/anaconda3/envs/luffycity/bin/python
"""
import os, sys
from faker import Faker
faker = Faker(["zh_CN"])
user = faker.unique.name()
print(f"hello,{user}")
# python获取终端参数
try:
dir = sys.argv[1] # 0 ==> ./test1.py 1 ==> user
except Exception as e:
dir = "2021"
# python直接执行shell命令
# ret = os.popen("ls -l")
ret = os.popen("ls -l") # 等同于上一行
print(ret.read())
ret = os.popen(f"mkdir {dir} && cd {dir} && echo 'hello {user}' > index.html") # 等同于上一行
print(ret.read())
编写shell脚本
首行指定运行当前代码的shell解释器。写完整路径。
test2.sh,代码:
#!/bin/bash
ls -lar
echo 'hello'
git add .
git commit -m "hello"
git push
# 通过这种方式执行命令行语句可以保存记录,一目了然执行过哪些命令
执行脚本需要权限
不管编写的什么的脚本命令,编写完脚本以后,脚本本身因为操作系统默认会取消它的执行权限,所以我们通过以下命令来增加执行的权限。
chmod +x 对应的文件名
# chmod 755 对应的文件名
# 例如,给python脚本赋予执行的权限。文件名假设为:test1.py
chmod +x test1.py
# 例如,shell脚本赋予执行的权限,文件名假设为:test2.sh
chmod +x test2.sh
赋予了权限以后,就可以执行脚本了。
但是执行过程中, 一定使用相对路径的方式来执行这个脚本。
# 例如,上面的test1.py或者test2.sh
./test1.py
./test2.sh
# 如果不希望使用相对路径,则需要把当前文件所载的目录设置为环境变量才行。
使用shell命令来完成测试数据的添加
-
编写一个sql语句的文件test_data.sql
-- 如果使用数据库本身的外键,则添加/删除/修改数据时,务必关闭原来表中的主外键约束功能 set FOREIGN_KEY_CHECKS=0; -- 清空原有的课程信息表信息 truncate table fg_course_info; -- 添加课程信息 INSERT INTO luffycity.fg_course_info (id, name, orders, is_show, is_deleted, created_time, updated_time, course_cover, course_video, course_type, level, description, pub_date, period, attachment_path, attachment_link, status, students, lessons, pub_lessons, price, recomment_home_hot, recomment_home_top, category_id, direction_id, teacher_id) VALUES (1, '7天Typescript从入门到放弃', 1, 1, 0, '2021-07-22 04:35:05.696823', '2021-07-22 04:35:05.696871', 'course/cover/course-10.png', '', 0, 0, '<p>7天Typescript从入门到放弃</p>', '2021-07-22', 7, 'luffycity-celery用法1.zip', null, 0, 988, 100, 30, 998.00, 1, 1, 2, 1, 1), (2, '3天Typescript精修', 1, 1, 0, '2021-07-22 04:35:05.696823', '2021-07-22 04:35:05.696871', 'course/cover/course-9.png', '', 0, 0, '<p>3天Typescript精修</p>', '2021-07-22', 7, 'luffycity-celery用法1.zip', null, 0, 988, 100, 30, 998.00, 1, 1, 2, 1, 1), (3, '3天学会Vue基础', 1, 1, 0, '2021-07-22 04:35:05.696823', '2021-07-22 04:35:05.696871', 'course/cover/course-8.png', '', 0, 0, '<p>3天学会Vue基础</p>', '2021-07-22', 7, 'luffycity-celery用法1.zip', null, 0, 988, 100, 30, 998.00, 1, 1, 2, 1, 1); -- 如果使用数据库本身的外键,则添加/删除/修改数据以后,务必开启原来表中的主外键约束功能 set FOREIGN_KEY_CHECKS=1;
-
编写一个shell脚本test_data.sh来执行上面的文件
#! /bin/bash mysql -uroot -p123 luffycity < ./test_data.sql
-
赋予create_data.sh执行的权限
chmod +x test_data.sh ./test_data.sh
若有错误与不足请指出,关注DPT一起进步吧!!