ORM简介

ORM 简介

  • ORM: object relation mapping ----> 对象 关系 映射

    第一层: orm:不写sql语句, 类/对象和sql建立对应关系, 即将类与对象和方法 翻译成 sql 传给 pymysql----符合pythonic

    第二层: pymysql: 接收上层orm的sql,pymysql--传给mysql指令执行sql:本质是sql语句----不符合pythonic

    第三层: mysql: 提供接口,接收pymysql 执行sql语句, 从db/磁盘中操作数据

    第四层: db/磁盘: 提供数据

    三种映射关系:

    • 类 ------>表
    • 类属性------->表字段
    • 类对象 ------>表记录 ****

单表操作

  • 创建表

  1. 创建表: models.py

    app目录

    from django.db import models
    
    
    # Create your models here.
    # 存放表结构
    
    # 图书管理系统
    
    # 单表系统
    
    class Book(models.Model):  # 继承models.Model类
        nid = models.AutoField(primary_key=True)  # 自增主键
        title = models.CharField(max_length=32)  # 字符串,最大值32个字符
        price = models.DecimalField(max_digits=8, decimal_places=2)  # 精度最高的浮点, 最大8位,2位浮点小数: 999999.99
        pub_date = models.DateTimeField()  # "2012-12-12"
        publish = models.CharField(max_length=32)
    
    
  2. settings配置数据库引擎: setting.py

    对应的数据库有对应的数据库引擎

    若想将模型转为mysql数据库中的表,需要在settings中配置

    项目目录

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'bms',  # 要连接的数据库,连接前需要创建好
            'USER': 'root',  # 连接数据库的用户名
            'PASSWORD': '',  # 连接数据库的密码
            'HOST': '127.0.0.1',  # 连接主机,默认本机
            'PORT': 3306  # 端口 默认3306
        }
    }
    
    # django2.2需添加取消外键检查,否则会报错
            'OPTIONS': {
                "init_command": "SET foreign_key_checks = 0;",
            }
    
    • 注意1:NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而默认的sqlite数据库下的db.sqlite3则是项目自动创建 USER和PASSWORD分别是数据库的用户名和密码。设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。然后,启动项目,会报错:no module named MySQLdb 。这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb 对于py3有很大问题,所以我们需要的驱动是PyMySQL 所以,我们只需要找到项目名文件下的__init__,在里面写入:

      # __init__.py
      
      import pymysql
      pymysql.install_as_MySQLdb()
      
    • 注意2:确保配置文件中的INSTALLED_APPS中写入我们创建的app名称

      INSTALLED_APPS = [
          'django.contrib.admin',
          'django.contrib.auth',
          'django.contrib.contenttypes',
          'django.contrib.sessions',
          'django.contrib.messages',
          'django.contrib.staticfiles',
          'app01.apps.App01Config',  # ***********
      ]
      
  3. 最后通过两条数据库迁移命令即可在指定的数据库中创建表:

    • python manage.py makemigrations:这个命令是记录我们对models.py的所有改动,并且将这个改动迁移到migrations这个文件下生成一个文件例如:0001文件,如果你接下来还要进行改动的话可能生成就是另外一个文件不一定都是0001文件,但是这个命令并没有作用到数据库。

    • python manage.py migrate: 这条命令的主要作用就是把这些改动作用到数据库也就是执行migrations里面新改动的迁移文件更新数据库,比如创建数据表,或者增加字段属性

      原文链接:https://blog.csdn.net/hpu_yly_bj/java/article/details/78928089

      数据库迁移: django会把settings中的INSTALL_APPS中的每一个应用中models对应的类创建成数据库中的表

    # terminal
    
    python manage.py makemigrations  # 检查与上次迁移的变化
    python manage.py migrate	
    
    # 如果出现各种不可解决的迁移数据库问题,可以删除app应用目录下的migrations目录下的迁移文件,并删除mysql当前database库中django_migrations表对应的迁移文件记录,同时删除表。再重新执行数据库迁移。如果只删除django项目的app应用目录下的migrations目录下的迁移文件,django会调用django_migrations表记录,检测到已经运行过了,不再执行
    
  • 添加表记录

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'books/add/', views.add_book)
    ]
    
    

    views.py

    1. 实例化方式:book = Book(title='python', price='100', pub_date='2012-12-12', publish='人民出版社')

    2. objects方法:book = Book.objects.create(title='linux', price='80', pub_date='2012-12-12', publish='人民出版社')

      Book.objects.creat()有返回值,返回值为Book的实例对象

      objects是管理器

    from django.shortcuts import render, HttpResponse
    from app01.models import Book
    
    
    # Create your views here.
    
    
    def add_book(request):
        """
        添加表记录:
    
    
        @param request:
        @return:
        """
        # 1. 实例化方式(不常用)
        book = Book(title='python', price='100', pub_date='2012-12-12', publish='人民出版社')
        book.save()
        print(book.nid)
        print(book.title)
        
        # 2. orm方式,object管理器
        # Book.objects.creat()有返回值,返回值为Book的实例对象
        book = Book.objects.create(title='linux', price='80', pub_date='2012-12-12', publish='人民出版社')
    	print(book.nid)
        print(book.publish)
    
        return HttpResponse('sucess')
    

    orm中的表操作其实就是sql语法的操作命令: 如果想打印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',
      },
    }
    }
    
原文地址:https://www.cnblogs.com/relaxlee/p/12843118.html