django中每一个模型model都对应于数据库中的一张表,每个模型中的字段都对应于数据库表的列。方便的是,django可以自动生成这些create table, alter table, drop table的操作。其次django为咱们也提供了后台管理模块(django-admin),主要功能是通过后台管理来实现客户端的功能,可以对数据进行增删改查。也可以通过该功能进行二次开发
django中的mysql配置
在上期内容,我们了解了settings.py配置信息的内容,其中databases是用来管理数据库配置的,默认是sqlite3数据库,所以我们需要将其修改成mysql数据库。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# database # https://docs.djangoproject.com/en/2.0/ref/settings/#databases # 数据库配置 默认的数据库为sqlite # databases = { # 'default': { # 'engine': 'django.db.backends.sqlite3', # 'name': os.path.join(base_dir, 'db.sqlite3'), # } # } databases = { 'default' : { 'engine' : 'django.db.backends.mysql' , # 数据库引擎 'name' : 'django_mysql' , # 数据库名 'user' : 'root' , # 账号 'password' : 'root' , # 密码 'host' : '127.0.0.1' , # host 'post' : 3306 , # 端口 } } |
字段名称代码中都添加了相应说明,engine为mysql数据库引擎,这个当然不会凭空出现,需要我们去安装
安装pymysql
1
|
pip3 install pymysql |
项目中配置
在最开始的项目包下的 init .py中进行如下配置
1
2
3
4
5
6
7
|
""" setting中的配置默认为sqlite3数据库 当需要修改成mysql时 并且在setting.py的同级目录的__init__.py 加入如下配置 否则会报错: error loading mysqldb module. """ import pymysql pymysql.install_as_mysqldb() |
如果mysql配置信息错误(用户名、密码、host等)控制台会报如下异常
pymysql.err.operationalerror: (1045, "access denied for user 'root'@'localhost' (using password: yes)")
在app文件的models.py文件中 创建student(学生信息)和studentunion(社团信息)
models.py:数据模块,用于数据库设计
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
""" 创建学生信息表模型 """ from django.db import models """ 该类是用来生成数据库的 必须要继承models.model """ class student(models.model): """ 创建如下几个表的字段 """ # 学号 primary_key=true: 该字段为主键 studentnum = models.charfield( '学号' , primary_key = true, max_length = 15 ) # 姓名 字符串 最大长度20 name = models.charfield( '姓名' , max_length = 20 ) # 年龄 整数 null=false, 表示该字段不能为空 age = models.integerfield( '年龄' , null = false) # 性别 布尔类型 默认true: 男生 false:女生 sex = models.booleanfield( '性别' , default = true) # 手机 unique=true 该字段唯一 mobile = models.charfield( '手机' , unique = true, max_length = 15 ) # 创建时间 auto_now_add:只有在新增的时候才会生效 createtime = models.datetimefield(auto_now_add = true) # 修改时间 auto_now: 添加和修改都会改变时间 modifytime = models.datetimefield(auto_now = true) # 指定表名 不指定默认app名字——类名(app_demo_student) class meta: db_table = 'student' """ 学生社团信息表 """ class studentunion(models.model): # 自增主键, 这里不能设置default属性,负责执行save的时候就不会新增而是修改元素 id = models.integerfield(primary_key = true) # 社团名称 unionname = models.charfield( '社团名称' , max_length = 20 ) # 社团人数 unionnum = models.integerfield( '人数' , default = 0 ) # 社团负责人 关联student的主键 即studentnum学号 一对一的关系,on__delete 属性在django2.0之后为必填属性后面会介绍 unionroot = models.onetoonefield(student, on_delete = none) class meta: db_table = 'student_union' """ onetoonefield: 一对一 foreignkey: 一对多 manytomanyfield: 多对多(没有ondelete 属性) """ |
在利用models.py文件生成数据库表之前,我们需要手动的先创建数据库:
1
2
|
mysql> create database django_mysql; query ok, 1 row affected ( 0.01 sec) |
创建完django_msql库之后,我们在终端执行如下命令,他的作用是将models文件生成一个迁移文件
1
|
python3 manage.py makemigrations |
迁移文件生成完毕,执行
1
|
python3 manage.py migrate |
会将迁移文件的内容作用到数据库中,生成表或者修改字段属性
控制台输出如下,则表示执行成功
(django_venv) xxxxxdeair:djangodemo xxxxx$ python3 manage.py migrate
operations to perform:
apply all migrations: admin, app_demo, auth, contenttypes, sessions
running migrations:
applying contenttypes.0001_initial... ok
applying auth.0001_initial... ok
applying admin.0001_initial... ok
applying admin.0002_logentry_remove_auto_add... ok
applying admin.0003_logentry_add_action_flag_choices... ok
applying app_demo.0001_initial... ok
applying contenttypes.0002_remove_content_type_name... ok
applying auth.0002_alter_permission_name_max_length... ok
applying auth.0003_alter_user_email_max_length... ok
applying auth.0004_alter_user_username_opts... ok
applying auth.0005_alter_user_last_login_null... ok
applying auth.0006_require_contenttypes_0002... ok
applying auth.0007_alter_validators_add_error_messages... ok
applying auth.0008_alter_user_username_max_length... ok
applying auth.0009_alter_user_last_name_max_length... ok
applying sessions.0001_initial... ok
查看我们的django_mysql数据库,其中student和student_union就是用models文件生成的表,其他的表是项目自动生成的,暂时可以先不用管
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
mysql> use django_mysql database changed mysql> show tables; + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | tables_in_django_mysql | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | | student | | student_union | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 12 rows in set ( 0.00 sec) |
表结构
desc查看表结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
mysql> desc student; + - - - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - + | field | type | null | key | default | extra | + - - - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - + | studentnum | varchar( 15 ) | no | pri | null | | | name | varchar( 20 ) | no | | null | | | age | int ( 11 ) | no | | null | | | sex | tinyint( 1 ) | no | | null | | | mobile | varchar( 15 ) | no | uni | null | | | createtime | datetime( 6 ) | no | | null | | | modifytime | datetime( 6 ) | no | | null | | + - - - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - + 7 rows in set ( 0.00 sec) mysql> desc student_union; + - - - - - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - + | field | type | null | key | default | extra | + - - - - - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - + | id | int ( 11 ) | no | pri | null | | | unionname | varchar( 20 ) | no | | null | | | unionnum | int ( 11 ) | no | | null | | | unionroot_id | varchar( 15 ) | no | uni | null | | + - - - - - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - + 4 rows in set ( 0.00 sec) |
至此django利用models文件创建数据库表的功能已经完毕。接下来用代码的方式演示一下django如何进行增删改查
增加数据
为了提供一些测试数据,这里用for循环批量的加了几条简单的数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
from app_demo.models import student import random """ 插入测试数据 """ def insert(request): # 随机整数 作为学号 for i in range ( 0 , 5 ): studentnum = int (random.uniform( 0 , 1 ) * 10000000000 ) # 从models文件中获取student对象 student = student() # 给对象赋值 student.studentnum = studentnum student.name = 'tom' + str (i) student.age = 15 student.sex = random.choice([true, false]) student.mobile = int (random.uniform( 0 , 1 ) * 10000000000 ) # 插入数据 student.save() return httpresponse( '数据插入完毕' ) |
urls.py 文件中 urlpatterns中配置
1
|
url(r '^insert/' , views.insert) |
浏览器中访问http://localhost:8000/insert/ 浏览器显示‘数据插入完毕'
查询数据库,发现有5天数据,也就是插入成功
1
2
3
4
5
6
7
8
9
10
11
|
mysql> select * from student; + - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | studentnum | name | age | sex | mobile | createtime | modifytime | + - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | 1352687635 | tom2 | 15 | 1 | 941807449 | 2018 - 11 - 08 09 : 58 : 40.226856 | 2018 - 11 - 08 09 : 58 : 40.227002 | | 5554311867 | tom0 | 15 | 0 | 1598619027 | 2018 - 11 - 08 09 : 58 : 40.203807 | 2018 - 11 - 08 09 : 58 : 40.203960 | | 7302510986 | tom4 | 15 | 0 | 9602601619 | 2018 - 11 - 08 09 : 58 : 40.251479 | 2018 - 11 - 08 09 : 58 : 40.251682 | | 847849420 | tom3 | 15 | 0 | 195276039 | 2018 - 11 - 08 09 : 58 : 40.238601 | 2018 - 11 - 08 09 : 58 : 40.238928 | | 9962892430 | tom1 | 15 | 0 | 3265013828 | 2018 - 11 - 08 09 : 58 : 40.215488 | 2018 - 11 - 08 09 : 58 : 40.216106 | + - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 5 rows in set ( 0.00 sec) |
查询数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
""" 查询 """ def find(request): #sql = 'select * from student' # django 也可以执行原生的sql语句 #result = student.objects.raw(sql) # 查询name = tom1的数据 result = student.objects. filter (name = 'tom1' ) """ result为<class 'django.db.models.query.queryset'>的对象 需要进行数据处理 """ arr = [] for i in result: content = { '学号' : i.studentnum, '姓名' : i.name, '性别' : i.sex} arr.append(content) print (arr) print ( type (arr)) return httpresponse(arr) |
配置urls,浏览器访问localhost:8000/find/
修改数据
1
2
3
4
5
6
7
8
9
10
11
12
13
|
""" 修改 """ def modify(request, studentnum): # 通过学号获取student对象 student = student.objects.get(studentnum = studentnum) # 设置student的name为jack student.name = 'jack' student.save() return httpresponse( '修改成功.' ) setting文件中的配置如下 url(r '^modify/(?p<studentnum>\d+)' , views.modify), |
setting文件中的配置如下
1
|
url(r '^modify/(?p<studentnum>\d+)' , views.modify), |
修改学号847849420的name为jack
再次查询mysql数据库,发现name已经被更新成了jack
1
2
3
4
5
6
7
|
mysql> select * from student where studentnum = '847849420' ; + - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | studentnum | name | age | sex | mobile | createtime | modifytime | + - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | 847849420 | jack | 15 | 0 | 195276039 | 2018 - 11 - 08 09 : 58 : 40.238601 | 2018 - 11 - 08 10 : 22 : 46.403147 | + - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 1 row in set ( 0.00 sec) |
删除数据
1
2
3
4
5
6
7
|
""" 删除 """ def delete(request, studentnum): student = student.objects.get(studentnum = studentnum) student.delete() return httpresponse( '删除成功.' ) |
settings.py中urlpatterns的配置如下
1
|
url(r '^delete/(?p<studentnum>.+)' , views.delete) |
.+ 表示匹配多个字符(不包括换行等字符)
浏览器请求该视图
查询数据库,发现该数据已经被删除
1
2
|
mysql> select * from student where studentnum = '847849420' ; empty set ( 0.01 sec) |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/wyl-0120/p/10005289.html