【Django】ORM操作数据库


一、Django数据库配置

映射关系:

  表名 -------------------->类名

  字段-------------------->属性

  表记录----------------->类实例化对象

ORM的两大功能:

  操作表:

    - 创建表

    - 修改表

    - 删除表

  操作数据行:

    - 增 删 改 查

ORM利用mysqlclient 或pymysql第三方工具链接数据库

Django默认的是sqlite数据库

1、settings.py 配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_orm',    #数据库名称
        'USER': 'root',   #数据库用户名
        'PASSWORD': 'root',     #数据库密码
        'HOST': '',     #数据库主机,留空默认为localhost 即127.0.0.1
        'PORT': '3306',     #数据库端口
    }
}

2、在项目文件夹下 __init__.py 导入pymysql(可选)

也可以使用mysqlclient连接数据库,mysqlclient底层用C语言编写的数据库封装,执行效率较高(推荐使用),

安装方式:pip install mysqlclient

3、命令行中打印 SQL语句  ---> 配置在settings.py 中

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

二、创建表

Django没办法帮我们创建数据库,只能我们创建完之后告诉它,让django去连接

第一步:在cmd命令行中创建一个 django_orm 数据库

或者直接使用数据库可视化软件Navicat创建数据库,指定字符集和排序规则

第二步:在settings.py 中指定数据库名称

第三步:在models.py 中创建表对象

第四步:pycharm的terminal命令行中 初始化

python manage.py makemigrations   创建数据库迁移脚本

python manage.py migrate   映射到数据库

执行成功之后 项目文件夹app01 的migrations 文件夹下生成一个  xxx_initial.py 文件

第五步:在pycharm中可视化的向数据库添加内容

配置:

修改表中字段,重新初始化

注意:想在pycharm终端显示对应的ORM语句底层转化的sql 语句,需要在 项目settings.py 做相关配置:

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.py 添加SQL语句日志

三、数据库的表操作 

<1>  每个数据模型都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交互的方法。并提供了一个简介漂亮的定义数据库字段的语法。

<2>  每个模型相当于单个数据库表(多对多关系例外,会多生成一张关系表),每个属性也是这个表中的字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。

大家可以留意下其它的类型都和数据库里的什么字段对应。

<3>  模型之间的三种关系:一对一,一对多,多对多。

             一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性;

             一对多:就是主外键关系;(foreign key)

             多对多:(ManyToManyField) 自动创建第三张表(当然我们也可以自己创建第三张表:两个foreign key)

<4>  表常用的字段类型参数有:

常见类型有:CharField  IntegerField  FloatField  BooleanField  DateField  ImageField  FileField  URLField

<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 用一个