055.Python前端Django模型ORM

由于前面在centos实验的过程中,pymql一直有属性错误,很难排查出问题,重新做了一个ubuntu的桌面系统同时使用pycharm开发工具作为学习开发工具,具体原因是因为在项目命名出现问题,和自己带的模块冲突,导致不能成功

一 ORM简介

对象关系映射(Object Relational Mapping,简称ORM)。

简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。ORM在业务逻辑层和数据库层之间充当了桥梁的作用。

通过一张图来介绍一下数据库与python代码之间的一个关系:

055.Python前端Django模型ORM_第1张图片

1.1 ORM特点

ORM的优点

  • 不用写繁琐的SQL语句,用咱们熟悉的python代码,就能实现对数据的操作,提高开发效率;
  • 可以平滑的操作,切换数据库。

ORM的缺点

  • ORM代码转换为SQL语句时,需要花费一定的时间,执行效率会有所降低;
  • 长期写ORM代码,导致写SQL语句能力,会有所减弱。 

1.2 改进

如果想打印orm转换过程中的sql,需要在settings中进行如下配置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}  
settings配置

二 单表操作

django使用MySQL的流程:

2.1 创建MySQL数据库

注意:ORM无法操作到数据库级别,只能操作到数据表。

安装mysql

apt-get install mysql-server mysql-common mysql-client

root@darren-virtual-machine:~# systemctl status mysql

mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-04-05 11:46:45 CST; 58s ago
 Main PID: 16219 (mysqld)
    Tasks: 27 (limit: 11869)
   CGroup: /system.slice/mysql.service
           └─16219 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid

4月 05 11:46:44 darren-virtual-machine systemd[1]: Starting MySQL Community Server...
4月 05 11:46:45 darren-virtual-machine systemd[1]: Started MySQL Community Server.

root@darren-virtual-machine:~# mysql -V

mysql  Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using  EditLine wrapper

root@darren-virtual-machine:~# cat /etc/mysql/debian.cnf

# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = gpitUmpta6ImT8hh
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host     = localhost
user     = debian-sys-maint
password = gpitUmpta6ImT8hh
socket   = /var/run/mysqld/mysqld.sock

可以使用上面的用户名和密码,也可以直接登录

登录mysql

055.Python前端Django模型ORM_第2张图片

2.2  修改密码

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> update user set authentication_string=PASSWORD("123456")  where user='root';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> update user set plugin="mysql_native_password";
Query OK, 1 row affected (0.00 sec)
Rows matched: 4  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit

2.3  登进数据库建库操作

root@darren-virtual-machine:~# mysql -uroot -p123456

mysql> create database django default charset=utf8;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| django             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

三  创建项目连接数据库

3.1 创建一个新的项目

root@darren-virtual-machine:~# cd /root/PycharmProjects/

root@darren-virtual-machine:~/PycharmProjects# django-admin startproject mystie

root@darren-virtual-machine:~/PycharmProjects# cd mysite/

root@darren-virtual-machine:~/PycharmProjects/mysite# tree ./*

./manage.py [error opening dir]
./mysite
├── asgi.py
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py

3.2 创建一个app应用

root@darren-virtual-machine:~/PycharmProjects/mysite# python3 manage.py startapp app01

root@darren-virtual-machine:~/PycharmProjects/mysite# vim mysite/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
]

3.3  在settings.py里设置数据库连接

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': "root",
        'PASSWORD': "123456",
    }
}

3.4 pymysql操作

root@darren-virtual-machine:~/PycharmProjects/mysite#  pip3 install pymysql

Collecting pymysql
  Downloading PyMySQL-0.9.3-py2.py3-none-any.whl (47 kB)
     |████████████████████████████████| 47 kB 175 kB/s
Installing collected packages: pymysql
Successfully installed pymysql-0.9.3

3.4.1  告诉Django使用pymysql模块连接mysql数据库

root@darren-virtual-machine:~/PycharmProjects/mysite# vim mysite/__init__.py 

# 在与settings.py同级目录下的__init__.py中
import pymysql
pymysql.install_as_MySQLdb()

3.4.2 创建模型(在models.py中写类)

[root@node10 pymysql]# cat app01/models.py

from django.db import models

# Create your models here.
class Book(models.Model):
        title = models.CharField(max_length=32)
        author = models.CharField(max_length=32)
        publisher = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=5, decimal_places=2)
        pub_date = models.DateField()

扩展:更多字段和参数

每个字段有一些特有的参数,例如,CharField需要max_length参数来指定VARCHAR数据库字段的大小。还有一些适用于所有字段的通用参数。 这些参数在文档中有详细定义,这里我们只简单介绍一些最常用的:

更多字段:

<1> CharField
        字符串字段, 用于较短的字符串.
        CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.
 
<2> IntegerField
       #用于保存一个整数.
 
<3> FloatField
        一个浮点数. 必须 提供两个参数:
         
        参数    描述
        max_digits    总位数(不包括小数点和符号)
        decimal_places    小数位数
                举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段:
                 
                models.FloatField(..., max_digits=5, decimal_places=2)
                要保存最大值一百万(小数点后保存10位)的话,你要这样定义:
                 
                models.FloatField(..., max_digits=19, decimal_places=10)
                admin 用一个文本框()表示该字段保存的数据.
 
<4> AutoField
        一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段;
        自定义一个主键:my_id=models.AutoField(primary_key=True)
        如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.
 
<5> BooleanField
        A true/false field. admin 用 checkbox 来表示此类字段.
 
<6> TextField
        一个容量很大的文本字段.
        admin 用一个