02-Django配置数据库

一. 配置数据库

1. 安装第三方模块
      pip install mysqlclient

2. django连接数据库
            在项目中的settings.py中配置
             将:
                DATABASES = {'default': {
                    'ENGINE': 'django.db.backends.sqlite3',
                    'NAME': BASE_DIR / 'db.sqlite3',}}
             修改为:
                DATABASES = {
                    'default': {
                        'ENGINE': 'django.db.backends.mysql', # 修改为mysql
                        'NAME': "dbname",  # 数据库名字
                        "USER": "ROOT",  # 用户名
                        "PASSWORD": "XXX",  # 密码
                        "HOST": "",  # ip
                        "PORT": ""  # 端口 }}

二. 数据库的数据类型

类型:
        AutoField: 整形
        IntegerField: 整形
        SmallIntegerField: 小整数
        CharField: 字符串
        DecimalField: 小数
        DateTimeField: 时间
 
属性:
       primary_key=True 主键自增
       verbose_name="ID" : 备注
       max_digits=10: 数字总长10位
       decimal_places=2, # 小数后两位
       default=0 # 默认值

约束:
      # 约束,只能在另一张表中已存在的id
      # 1. 无约束
      # depart_id = models.BigIntegerField(verbose_name="部门id")
 
      # 2.  有约束
      # -to: 与那张表关联;
      # -to_fields: 与表中的那一列关联
      # 2.1 django自动:- 写的deport 生成数据列: deport_id
 
      # 3. 如果部门表删除一个部门,那么关联的用户怎么弄?
      # 3.1. 级联删除: on_delete=models.CASCADE
      deport = models.ForeignKey(to="Department", to_field="id", on_delete=models.CASCADE)
 
      # 3.2. 置空: null=True,blank=True, 允许为空 ,on_delete=models.SET_NULL: 设置为空
      # deport = models.ForeignKey(to="Department", to_fields="id", null=True, blank=True, on_delete=models.SET_NULL)
 
单选的约束:
      # django中做的约束,写性别时,只能写1或2
      gender_choices = (
          (1, "男"),
          (2, "女"),
      )
      gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices)



示例:
from django.db import models
# Create your models here.
 
class Department(models.Model):
    """部门表"""
    # id = models.BinaryField(primary_key=True, verbose_name="ID")
    # id = models.AutoField(primary_key=True, verbose_name="ID")
 
    title = models.CharField(max_length=32, verbose_name="标题")
 
 
class UserInfo(models.Model):
    """员工表"""
    name = models.CharField(max_length=16, verbose_name="姓名")
    password = models.CharField(max_length=64, verbose_name="密码")
    age = models.IntegerField(verbose_name="年龄")
    account = models.DecimalField(max_digits=10, verbose_name="账户余额", decimal_places=2, default=0)
    creat_time = models.DateTimeField(verbose_name="入职时间")
 
    # 约束,只能在另一张表中已存在的id
    # depart_id = models.BigIntegerField(verbose_name="部门id")  无约束
    # 有约束,如果删除关联表那剩下的表怎么弄?
    deport = models.ForeignKey(to="Department", to_field="id", on_delete=models.CASCADE) # 连级删除
    # deport = models.ForeignKey(to="Department", to_fields="id", null=True, blank=True, on_delete=models.SET_NULL)  # 允许为空
 
 
    gender_choices = (
        (1, "男"),
        (2, "女"),
    )
    gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices)

三. 操作数据库

1. 创建表;删除表;修改表:在models.py中创建数据库类
                class UserInfo(models.Model):
                    name = models.CharField(max_length=32)
                    password = models.CharField(max_length=64)
                    age = models.IntegerField()
                相当于:
                    create table app01_userinfo(
                        id bigint auto_increment primary key,
                        name varchar(32),
                        password varchar(64),
                        age int)
 
            - 2. 在终端执行命令:注意: APP已提前注册,
                  在次创建表就新创建类再次执行命令(删除表或删除列:把要删除的表或列注释掉,再次执行下面语句)
                        python manage.py makemigrations
                        python manage.py migrate
 
                  在表中新增列时,由于已经存在列中可能已有数据,所以新增列必须要指定列对应的数据:
                    1. 手动输入一个值
                    2. 新增列时添加默认值
                        age = models.IntegerField(default=2)
                    3. 允许为空
                        data = models.IntegerField(null=True,blank=True)
 
                    以后在开发过程中想要对表结构进项调整:
                        在models.py文件中操作类即可

四. 操作表数据

 根据创建的数据库类操作数据(类名.objects.xxx )
            - 1. 新增
                UserInfo.objects.create(name="lili", password="321", age=18)
 
            - 2. 删除
                 UserInfo.objects.filter(id=2).delete()  # 根据id=3条件删除
                 Department.objects.all().delete()  # 删除整张表所有数据
 
            - 3. 更新数据
                 UserInfo.objects.all().update(password=999) # 更新所有数据
                 UserInfo.objects.filter(id=3).update(password=666)  # 更新一条数据
 
            - 4. 获取数据 : data_list=[对象,对象,对象] 得到的是QuerySet类型
                 data_list = UserInfo.objects.all()  # 获取所有数据
                 for obj in data_list:
                     print(obj.id, obj.name, obj.password, obj.age)
 
                 data_list=[对象,]
                 data_list=UserInfo.objects.filter(id=3) # 获取一个数据,结果还是一个对象
                 print(data_list)
 
                 或直接获取第一行数据对象,不需要再次循环:
                 row_obj= UserInfo.objects.filter(id=3).first()
                 print(row_obj.name)

五. 运行

1. 工具连接mysql生成数据库 
        create database 库名 default charset utf8 collate utf8_general_ci;
    
    2. django 中修改配置文件,连接Mysql
    
    3. django命令生成数据库表
        python manage.py makemigrations
        python manage.py migrate

六. 查询方法

第一种:
    models.PrettyNum.objects.filter(mobile="13400000000",id=12)
第二种:
    data_dict={"mobile":"13400000000", "id":123}
    models.PrettyNum.objects.filter(**data_dict)

# 数字运算符:
    models.PrettyNum.objects.filter(id=12) # 等于12
    models.PrettyNum.objects.filter(id__gt=12) # 大于12
    models.PrettyNum.objects.filter(id__gte=12) # 大于等于12
    models.PrettyNum.objects.filter(id__lt=12) # 小于12
    models.PrettyNum.objects.filter(id__lte=12) # 小于等于12

    data_dict={"id_lte":12}
    models.PrettyNum.objects.filter(**data_dict)

# 字符串运算符:
    models.PrettyNum.objects.filter(mobile="13400000000")     #等于
    models.PrettyNum.objects.filter(mobile__startswith="134") # 以...开头
    models.PrettyNum.objects.filter(mobile__endswith="999")   # 以...结尾
    models.PrettyNum.objects.filter(mobile__contains="999")   # 包含

    data_dict={"mobile__contains":"999"}
    models.PrettyNum.objects.filter(**data_dict)



分页:
que = models.PrettyNum.objects.all()

que = models.PrettyNum.objects.filter(id=1)[0:10]

# 第一页
que = models.PrettyNum.objects.all()[0:10]

# 第二页
que = models.PrettyNum.objects.all()[10:20]

# 第三页
que = models.PrettyNum.objects.all()[20:30]


# 总数,得到的是一个数字
data = models.PrettyNum.objects.all().count()
data = models.PrettyNum.objects.filter(id=5).count()

你可能感兴趣的:(Django,django,数据库,python)