经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
django+mysql的使用示例
来源:jb51  时间:2018/11/25 19:40:25  对本文有异议

Django中每一个模型model都对应于数据库中的一张表,每个模型中的字段都对应于数据库表的列。方便的是,django可以自动生成这些create table, alter table, drop table的操作。其次Django为咱们也提供了后台管理模块(Django-Admin),主要功能是通过后台管理来实现客户端的功能,可以对数据进行增删改查。也可以通过该功能进行二次开发

Django中的mysql配置

在上期内容,我们了解了settings.py配置信息的内容,其中DATABASES是用来管理数据库配置的,默认是sqlite3数据库,所以我们需要将其修改成mysql数据库。

  1. # Database
  2. # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
  3.  
  4. # 数据库配置 默认的数据库为sqlite
  5. # DATABASES = {
  6. # 'default': {
  7. # 'ENGINE': 'django.db.backends.sqlite3',
  8. # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  9. # }
  10. # }
  11. DATABASES = {
  12. 'default': {
  13. 'ENGINE': 'django.db.backends.mysql', # 数据库引擎
  14. 'NAME': 'django_mysql', # 数据库名
  15. 'USER': 'root', # 账号
  16. 'PASSWORD': 'root', # 密码
  17. 'HOST': '127.0.0.1', # HOST
  18. 'POST': 3306, # 端口
  19.  
  20. }
  21. }

字段名称代码中都添加了相应说明,ENGINE为MYSQL数据库引擎,这个当然不会凭空出现,需要我们去安装

安装pymysql

  1. pip3 install pymysql

项目中配置

在最开始的项目包下的 init .py中进行如下配置

  1. """
  2. setting中的配置默认为sqlite3数据库 当需要修改成MySql时
  3. 并且在setting.py的同级目录的__init__.py 加入如下配置
  4. 否则会报错: Error loading MySQLdb module.
  5. """
  6. import pymysql
  7. 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. from django.db import models
  5.  
  6. """
  7. 该类是用来生成数据库的 必须要继承models.Model
  8. """
  9. class Student(models.Model):
  10. """
  11. 创建如下几个表的字段
  12. """
  13. # 学号 primary_key=True: 该字段为主键
  14. studentNum = models.CharField('学号', primary_key=True, max_length=15)
  15. # 姓名 字符串 最大长度20
  16. name = models.CharField('姓名', max_length=20)
  17. # 年龄 整数 null=False, 表示该字段不能为空
  18. age = models.IntegerField('年龄', null=False)
  19. # 性别 布尔类型 默认True: 男生 False:女生
  20. sex = models.BooleanField('性别', default=True)
  21. # 手机 unique=True 该字段唯一
  22. mobile = models.CharField('手机', unique=True, max_length=15)
  23. # 创建时间 auto_now_add:只有在新增的时候才会生效
  24. createTime = models.DateTimeField(auto_now_add=True)
  25. # 修改时间 auto_now: 添加和修改都会改变时间
  26. modifyTime = models.DateTimeField(auto_now=True)
  27.  
  28. # 指定表名 不指定默认APP名字——类名(app_demo_Student)
  29. class Meta:
  30. db_table = 'student'
  31.  
  32.  
  33. """
  34. 学生社团信息表
  35. """
  36. class studentUnion(models.Model):
  37. # 自增主键, 这里不能设置default属性,负责执行save的时候就不会新增而是修改元素
  38. id = models.IntegerField(primary_key=True)
  39. # 社团名称
  40. unionName = models.CharField('社团名称', max_length=20)
  41. # 社团人数
  42. unionNum = models.IntegerField('人数', default=0)
  43. # 社团负责人 关联Student的主键 即studentNum学号 一对一的关系,on__delete 属性在django2.0之后为必填属性后面会介绍
  44. unionRoot = models.OneToOneField(Student, on_delete=None)
  45.  
  46. class Meta:
  47. db_table = 'student_union'
  48.  
  49.  
  50. """
  51. OneToOneField: 一对一
  52. ForeignKey: 一对多
  53. ManyToManyField: 多对多(没有ondelete 属性)
  54. """

在利用models.py文件生成数据库表之前,我们需要手动的先创建数据库:

  1. mysql> create database django_mysql;
  2. 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. mysql> use django_mysql
  2. Database changed
  3.  
  4. mysql> show tables;
  5. +----------------------------+
  6. | Tables_in_django_mysql |
  7. +----------------------------+
  8. | auth_group |
  9. | auth_group_permissions |
  10. | auth_permission |
  11. | auth_user |
  12. | auth_user_groups |
  13. | auth_user_user_permissions |
  14. | django_admin_log |
  15. | django_content_type |
  16. | django_migrations |
  17. | django_session |
  18. | student |
  19. | student_union |
  20. +----------------------------+
  21. 12 rows in set (0.00 sec)

表结构

desc查看表结构

  1. mysql> desc student;
  2. +------------+-------------+------+-----+---------+-------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +------------+-------------+------+-----+---------+-------+
  5. | studentNum | varchar(15) | NO | PRI | NULL | |
  6. | name | varchar(20) | NO | | NULL | |
  7. | age | int(11) | NO | | NULL | |
  8. | sex | tinyint(1) | NO | | NULL | |
  9. | mobile | varchar(15) | NO | UNI | NULL | |
  10. | createTime | datetime(6) | NO | | NULL | |
  11. | modifyTime | datetime(6) | NO | | NULL | |
  12. +------------+-------------+------+-----+---------+-------+
  13. 7 rows in set (0.00 sec)
  14. mysql> desc student_union;
  15. +--------------+-------------+------+-----+---------+-------+
  16. | Field | Type | Null | Key | Default | Extra |
  17. +--------------+-------------+------+-----+---------+-------+
  18. | id | int(11) | NO | PRI | NULL | |
  19. | unionName | varchar(20) | NO | | NULL | |
  20. | unionNum | int(11) | NO | | NULL | |
  21. | unionRoot_id | varchar(15) | NO | UNI | NULL | |
  22. +--------------+-------------+------+-----+---------+-------+
  23. 4 rows in set (0.00 sec)

至此Django利用models文件创建数据库表的功能已经完毕。接下来用代码的方式演示一下Django如何进行增删改查

增加数据

为了提供一些测试数据,这里用for循环批量的加了几条简单的数据。

  1. from app_demo.models import Student
  2. import random
  3. """
  4. 插入测试数据
  5. """
  6. def insert(request):
  7. # 随机整数 作为学号
  8. for i in range(0, 5):
  9. studentNum = int(random.uniform(0, 1) * 10000000000)
  10. # 从models文件中获取student对象
  11. student = Student()
  12. # 给对象赋值
  13. student.studentNum = studentNum
  14. student.name = 'tom' + str(i)
  15. student.age = 15
  16. student.sex = random.choice([True, False])
  17. student.mobile = int(random.uniform(0, 1) * 10000000000)
  18. # 插入数据
  19. student.save()
  20.  
  21. return HttpResponse('数据插入完毕')

urls.py 文件中 urlpatterns中配置

  1. url(r'^insert/', views.insert)

浏览器中访问http://localhost:8000/insert/ 浏览器显示‘数据插入完毕'

查询数据库,发现有5天数据,也就是插入成功

  1. mysql> select * from student;
  2. +------------+------+-----+-----+------------+----------------------------+----------------------------+
  3. | studentNum | name | age | sex | mobile | createTime | modifyTime |
  4. +------------+------+-----+-----+------------+----------------------------+----------------------------+
  5. | 1352687635 | tom2 | 15 | 1 | 941807449 | 2018-11-08 09:58:40.226856 | 2018-11-08 09:58:40.227002 |
  6. | 5554311867 | tom0 | 15 | 0 | 1598619027 | 2018-11-08 09:58:40.203807 | 2018-11-08 09:58:40.203960 |
  7. | 7302510986 | tom4 | 15 | 0 | 9602601619 | 2018-11-08 09:58:40.251479 | 2018-11-08 09:58:40.251682 |
  8. | 847849420 | tom3 | 15 | 0 | 195276039 | 2018-11-08 09:58:40.238601 | 2018-11-08 09:58:40.238928 |
  9. | 9962892430 | tom1 | 15 | 0 | 3265013828 | 2018-11-08 09:58:40.215488 | 2018-11-08 09:58:40.216106 |
  10. +------------+------+-----+-----+------------+----------------------------+----------------------------+
  11. 5 rows in set (0.00 sec)

查询数据

  1. """
  2. 查询
  3. """
  4. def find(request):
  5. #sql = 'select * from student'
  6. # django 也可以执行原生的sql语句
  7. #result = Student.objects.raw(sql)
  8.  
  9. # 查询name = tom1的数据
  10. result = Student.objects.filter(name='tom1')
  11. """
  12. result为<class 'django.db.models.query.QuerySet'>的对象
  13. 需要进行数据处理
  14. """
  15. arr = []
  16. for i in result:
  17. content = {'学号': i.studentNum, '姓名': i.name, '性别': i.sex}
  18. arr.append(content)
  19. print(arr)
  20. print(type(arr))
  21. return HttpResponse(arr)

配置urls,浏览器访问localhost:8000/find/

 

修改数据

  1. """
  2. 修改
  3. """
  4. def modify(request, studentNum):
  5. # 通过学号获取student对象
  6. student = Student.objects.get(studentNum=studentNum)
  7. # 设置student的name为jack
  8. student.name = 'jack'
  9. student.save()
  10. return HttpResponse('修改成功.')
  11. setting文件中的配置如下
  12.  
  13. 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. mysql> select * from student where studentNum='847849420';
  2. +------------+------+-----+-----+-----------+----------------------------+----------------------------+
  3. | studentNum | name | age | sex | mobile | createTime | modifyTime |
  4. +------------+------+-----+-----+-----------+----------------------------+----------------------------+
  5. | 847849420 | jack | 15 | 0 | 195276039 | 2018-11-08 09:58:40.238601 | 2018-11-08 10:22:46.403147 |
  6. +------------+------+-----+-----+-----------+----------------------------+----------------------------+
  7. 1 row in set (0.00 sec)

删除数据

  1. """
  2. 删除
  3. """
  4. def delete(request, studentNum):
  5. student = Student.objects.get(studentNum=studentNum)
  6. student.delete()
  7. return HttpResponse('删除成功.')

settings.py中urlpatterns的配置如下

  1. url(r'^delete/(?P<studentNum>.+)', views.delete)

.+ 表示匹配多个字符(不包括换行等字符)

浏览器请求该视图

查询数据库,发现该数据已经被删除

  1. mysql> select * from student where studentNum='847849420';
  2. Empty set (0.01 sec)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号