• 三、python Django ORM操作数据库[命令、postgresql操作]


    一、数据库初始化

    前要:

    1. 安装postgresql apt install postgresql
    2. 进入:sudo -u postgres psql # 实际就是切入到postgres(安装的时候默认生成)用户并输入psql
    3. 修改密码:ALTER USER postgres WITH PASSWORD '123456';
    4. 下载python依赖:pip install psycopg2-binary

    基础操作:基本命令

    	\l --列出所有数据库
    	\c iotplus --进入数据库
    	You are now connected to database "iotplus" as user "postgres". --出现此行代表成功
    	\d --列出数据库中所有的表
    	\q --退出数据库
    
    • 1
    • 2
    • 3
    • 4
    • 5

    基本命令:

    sudo service postgresql start 启动
    sudo service postgresql stop 关闭
    sudo service postgresql status 状态
    
    • 1
    • 2
    • 3

    开启日志(包括普通记录和详细sql执行记录):

    gedit /etc/postgresql/12/main/postgresql.conf(设置下面这几个参数[已经存在,取消注释,修改等于后面的内容即可])

    log_statement = all		# none, ddl, mod, all
    log_truncate_on_rotation = off		
    log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'	# 文件名
    log_directory = '/etc/postgresql/12/main/log' # 日志存放地-路径为了自己能够找到自定义即可	
    logging_collector = on		# 开启日志记录
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.配置

    目录:项目目录/setting.py
    写入配置:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql', 
        	'NAME': 'postgres', # 数据库名称
            'USER': 'postgres', # 登录数据库的用户名
            'PASSWORD': ' ',# 登录数据库的密码
            'HOST': '127.0.0.1', # 数据库服务器的主机地址(默认本机为127.0.0.1)
            'PORT': '5432', # 数据库服务的端口号(默认为5432)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.创建模型

    目录:项目目录/app目录/models.py

    class Question(models.Model):
    	question_text = models.CharField(max_length=200)
    	pub_date = models.DateTimeField('date published')
    	def __str__(self):
    		return self.question_text
    
    class Choice(models.Model):
    	question = models.ForeignKey(Question, on_delete=models.CASCADE)
    	choice_text = models.CharField(max_length=200)
    	votes = models.IntegerField(default=0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    数据类型图:
    在这里插入图片描述
    数据类型参数:
    在这里插入图片描述
    注意__str__方法用于返回对象的描述信息,如果不使用__str__方法,直接print,或者return,返回的是对象的内存地址

    zhangsan = Student("张", 2200)
    print(zhangsan) # 如果Student这个class类,没有写__str__方法,输出的是内存地址,但是加上__str__就是值
    
    • 1
    • 2

    3.数据库迁移

    1. 生成脚本文件:python3 manage.py makemigrations
    2. 执行脚本文件(操作数据库):python3 manage.py migrate

    注意:Ⅰ.比如数据库表单已经生成,需要删除一个字段可以直接再次执行上诉命令;Ⅱ.添加字段必须要为其设置默认值,否则django会进行询问(可写入默认值,可退出该操作)

    4.手动删除表单

    1. 删除migrations里面初始化该数据库的文件,如果有下一个文件,打开删除dependencies依赖
    2. 在django_migrations表格里面删除写有该初始化记录的文件
    3. 自行用命令行或者可视化工具删除表格

    二、增删改查

    具体:书Django Web应用开发实战p161开始

    1.增

    from .models import Article
    Article.objects.create(title="My first article", body="My first article body")
    
    • 1
    • 2

    2.删

    2.1 删一条

    from .models import Article
    Article.objects.get(title="java").delete() 
    
    • 1
    • 2

    2.2 删多条(条件满足的)

    from .models import Article
    Article.objects.filter(title="java").delete() 
    
    • 1
    • 2

    2.3 on_delete删除模式

    写法:on_delete=models.CASCADE

    参数:

    1. PROTECT:如果删除的数据设有外键且关联其它数据表,就提示删除错误,其实在外键上就是不许删除
    2. CASCADE:级联删除,删除与主键关联表的数据,主键所在表的内容也会被删除反之则不会
    3. SET_NULL:置空模式,删除的时候,外键字段被设置为空,前提就是null=True
    4. SET_DEFAULT:置默认值,删除的时候,外键字段设置为默认值,前提就是default=‘默认值’(此时不能出现null=True,一对一特殊关系慎用)

    3.改

    3.1 改一条

    # get方式不能用update
    from .models import Article
    a = Article.objects.get(id=1)
    a.foreign_id=3
    a.save()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.2 改多条(条件满足的)

    from .models import Article
    Article.objects.filter(title='java').update(title='django')
    
    • 1
    • 2

    4.查

    4.1 查全部

    from .models import Article
    Article.objects.all() 
    
    • 1
    • 2

    4.2 查单个

    from .models import Article
    article = Article.objects.get(id=1)
    
    • 1
    • 2

    4.3 查多个

    from .models import Article
    article = Article.objects.filter(name='jack')
    
    • 1
    • 2

    4.4 数量查询

    from .models import Article
    article = Article.objects.filter(name='jack').count()
    
    • 1
    • 2

    4.5 多个条件

    4.5.1 and
    from .models import Article
    article = Article.objects.filter(name='jack',id=5)
    
    • 1
    • 2
    4.5.2 or
    from .models import Article
    from django.db.models import Q
    article = Article.objects.filter(Q(name='jack')|Q(passwd='5963'))
    
    • 1
    • 2
    • 3
    4.5.3 不等于查询
    from .models import Article
    article = Article.objects.filter(~Q(name='jack'))
    
    • 1
    • 2

    三、一对一、一对多、多对多

    在这里插入图片描述

    知识点:

    1. 正向查询:Info.objects.all()[0].foreign #info是有外键的表,foreign是定义的外键参数名
    2. 反向查询:
    # 一对一
    >>> a = User.objects.all()[0] # User是外键关联表
    >>> a.back #back是设置的外键属性related_name
    <InfoTwo: 1>
    # 一对多
    >>> a = Father.objects.all()[0]# Teacher是外键关联表
    >>> a.back.all() #back是设置的外键属性related_name
    <QuerySet [<Student: 563>, <Student: 563>]>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.一对一

    关系:人的身份证与人的关系,一一对应不可重复
    关键概念:

    1. 外键:其也属于一个键值,是真实在表格里面存在的,外键对应的内容是另一个表的主键
    2. 正向查询:在外键所在表查询到,与外键关联的表内容
    3. 反向查询:在与外键关联的表,查询到外键所在表内容

    知识点:

    1. OneToOneField:Info= models.OneToOneField(User, on_delete=models.CASCADE,related_name=‘back’) # 用于一对一查询

    设置外键:

    1. Info.objects.create(id=100,passwd='00',time=12,foreign_id=4) #确保关联表已经有数据关键是注意这个名字,与models.py里面定义的不一样
    from django.db import models
    
    
    # Create your models here.
    class User(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=20)
    
        def __str__(self):
            return self.name # 必须是字符串
    
    
    class Info(models.Model):
        id = models.AutoField(primary_key=True)
        passwd = models.CharField(max_length=30)
        time = models.IntegerField()
        foreign = models.OneToOneField(User, on_delete=models.CASCADE,related_name=‘back’) # on_delete解释看二、增删改查 2.删
    
        def __str__(self):
            return self.passwd # 必须是字符串
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2.一对多

    关系:父亲与孩子的关系,一个父亲有多个孩子,一个孩子只有一个父亲

    知识点:

    1. ForeignKey:foreign = models.ForeignKey(Teacher, on_delete=models.CASCADE,related_name=‘back’)

    设置外键:

    1. Son.objects.create(id=100,passwd='00',time=12,foreign_id=4) #确保关联表已经有数据关键是注意这个名字,与models.py里面定义的不一样
    class Father(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=20)
    
        def __str__(self):
            return self.name
    
    
    class Son(models.Model):
        id = models.AutoField(primary_key=True)
        passwd = models.CharField(max_length=30)
        time = models.IntegerField()
        foreign = models.ForeignKey(Teacher, on_delete=models.CASCADE,related_name=‘back’)# on_delete解释看二、增删改查 2.删
    
        def __str__(self):
            return self.passwd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    3.多对多

    关系:老师和学生的关系,一个老师有多个学生,一个学生有多个老师

    原理:多对多通过创建中间表格确定对应关系

    设置外键:

    1. 初始化:Student.objects.get(id=1).foreign.set([1,2,3])# 1,2,3默认都是与Student关联表的主键(set的特点:此例设置的Teacher的id的1,2,3关联到Student的id=1上面。如果原关系为1,2会直接改为1,2,3;如果原关系为1,2,3,4,5也会直接改为1,2,3) 总结:既能增加又能删除
    2. 增加:Student.objects.get(id=1).foreign.add(1,2)# 1,2默认都是与Student关联表的主键
    3. 删除:Student.objects.get(id=1).foreign.remove(1)# 1默认都是与Student关联表的主键
    4. 清空关系:Student.objects.get(id=1).foreign.clear()
    class Teacher(models.Model):
        id = models.AutoField()
        name = models.CharField(max_length=20, primary_key=True)
    
        def __str__(self):
            return self.name
    
    
    class Student(models.Model):
        id = models.AutoField(primary_key=True)
        passwd = models.CharField(max_length=30)
        time = models.IntegerField()
        foreign = models.ManyToManyField(Father, on_delete=models.CASCADE, related_name='back')
    
        def __str__(self):
            return self.passwd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    尚硅谷大数据项目《在线教育之实时数仓》笔记005
    【计算机毕业设计】企业员工岗前培训管理系统
    【力扣】55. 跳跃游戏 <贪心>
    java毕业设计滴答拍摄影项目(附源码、数据库)
    基于ZigBee设计的物联网LED控制系统
    贪心算法(2)--衍生问题
    vsto 任务面板 添加自定义控件
    【Python】《Python编程:从入门到实践 (第2版) 》笔记-Chapter8-函数
    19-28-hive-数据类型-DDL
    2023年最新 Nonobot2 制作QQ聊天机器人详细教程(每周更新中)
  • 原文地址:https://blog.csdn.net/weixin_46765649/article/details/125723021