Django-11 模型层及ORM介绍 ORM框架

Django配置mysql

  • 安装mysqlclient[版本 mysqlclient 1.3.13以上,官网目前为1.4.x ]
sudo pip3 install mysqlclient

创建数据库

  • 进入mysql数据库执行
    • create database 数据库名 default charset utf8
    • 通常数据库名跟项目名保持一致
  • settings.py 里进行数据库的配置
    • 修改DATABASES配置项的内容,由sqlite3变为mysql

创建好后如果报错:
NameError: name '_mysql' is not defined
需在项目的_init_.py文件下加

import pymysql 
pymysql.install_as_MySQLdb()

重新执行后如果报错
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required; you have 0.10.1.
有一个好办法,直接指定版本,比其他的解决方法简单一些…

import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()

什么是模型

  • 模型是一个python类,它是由django.db.models.Model派生出的子类。
  • 一个模型类代表数据库中的一张数据表
  • 模型类中每一个类属性都代表数据库中的一个字段
  • 模型是数据交互的接口,是代表和操作数据库的方法和方式

ORM框架

  • 定义:ORM(Object Relational Mapping)即对象关系映射,它是一种程序技术,它允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库
  • 作用:
    1. 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。
    2. 根据设计的模型类生成数据库中的表格
    3. 通过简单的配置就可以进行数据库的切换
  • 优点
    1. 只需要面向对象编程,不需要面向数据库编写代码。
      对数据库的操作都转化为对类属性和方法的操作
      不用编写各种数据库的sql语句
    2. 实现了数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异
      不再关注用的是mysql,oracle...等数据库的内部细节
      通过简单的配置就可以轻松更换数据库,而不需要修改代码
  • 缺点
    1. 对于复杂业务,使用成本较高
    2. 根据对象的操作转换成SQL语句,根据查询的结果转换成对象,在映射过程中有性能损失

模型类代码示例

from django.db import models
# Create your models here.
class Book(models.Model):
    title = models.CharField("书名",max_length=50,default='')
    price = models.DecimalField('价格',max_digits=7,decimal_places=2,default=0.0)
    

数据库迁移

  • 迁移是Django同步您对模型所做更改(添加字段,删除模型等)到您的数据库模式的方法
    1. 生成迁移文件 - 执行 python3 manage.py makemigrations
      将应用下的models.py文件生成一个中间文件,并保存在migrations文件夹中
    2. 执行迁移脚本程序 - 执行 python3 manage.py migrate
      执行迁移程序实现迁移。将每个应用下的migrations目录中的中间文件同步回数据库

实操:

^CliujiadeMacBook-Pro:mysite1 liujia$ python3 manage.py startapp bookstore
liujiadeMacBook-Pro:mysite1 liujia$ python3 manage.py makemigrations
Migrations for 'bookstore':
  bookstore/migrations/0001_initial.py
    - Create model Book
liujiadeMacBook-Pro:mysite1 liujia$ python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, bookstore, 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 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 auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying bookstore.0001_initial... OK
  Applying sessions.0001_initial... OK
liujiadeMacBook-Pro:mysite1 liujia$ 
mysql> use mysite1
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> show tables;
+----------------------------+
| Tables_in_mysite1          |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| bookstore_book             |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
11 rows in set (0.00 sec)

mysql> desc bookstore_book;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | bigint       | NO   | PRI | NULL    | auto_increment |
| title | varchar(50)  | NO   |     | NULL    |                |
| price | decimal(7,2) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)

mysql> 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章