django ORM框架(操作数据库)第一章

news2024/11/23 21:07:29

目录

一、ORM框架介绍

二、Django配置数据库

2.1 在本地mysql中创建数据库与用户

2.2 django 连接本地mysql(安装mysqlclient及依赖环境)mac安装

三、模型类

3.1、创建模型类&生成迁移脚本&执行迁移脚本

3.2 类属性&表字段介绍

3.2.1  models.CharField() 字符串

3.2.2 时间相关:DateTimeField 与DateField

3.2.3 自定义主键 primary_key=True

3.2.4 自定义表名称&内部类&排序

3.2.5 演示 

四、CURD 增删改查

4.1 新增数据 Create

4.2  查询 Read

4.2.1 读取表里所有数据

4.2.2 读取单条数据 (不推荐): 模型类.objects.get(条件1=值1)   

4.2.3 读取多/单条数据(推荐):objects.filter(条件1=值1)

4.2.4   .objects.filter 多种查询类型

4.2.5   .objects.exclude 反向查询 (常用)

五、QuerySet 介绍

六、公共模型类

下一章:


一、ORM框架介绍

ORM框架,把类和数据进行映射,通过类和对象操作它对应表格中的数据,进行增删改查(CRUD)

ORM框架中

数据库:需要提前手动创建数据库

数据表:与OMR框架中的模型类对应

字段:模型类中的类属性(Field子类)

记录:一行数据,多个模型类(字段)的实例。

二、Django配置数据库

2.1 在本地mysql中创建数据库与用户

1、启动本地的mysql

(我的是mac电脑,在系统偏好设置里,点击mysql图标进行启动)

root

123456

2.2 django 连接本地mysql(安装mysqlclient及依赖环境)mac安装

听说win安装mysqlclient 难度挺大,我这里用的mac

1、检查本地是否安装brew。如已经安装,跳过这一步

如果没有安装,则安装brew。安装brew的方法

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

 安装brew方法:

mac 安装 brew 亲测有效_做测试的喵酱的博客-CSDN博客

2、安装mysql-client

我mac本地,安装的mysql 版本是5.7.10 

所以我安装mysql-client 版本也要求为5.7

如果你是【mac】需要安装mysql-client (指定版本)

 brew install mysql-client@5.7

如果你是 【Debian / Ubuntu】

sudo apt-get install python-dev default-libmysqlclient-dev

 如果你是 【Red Hat / CentOS】

sudo yum install python-devel mysql-devel

3、【mac】配置mysql-client的环境变量

找到mysql-client的安装路径,一般为/opt/homebrew/Cellar/mysql-client@5.7/

配置环境变量

vim ~/.zshrc
export PATH="/opt/homebrew/opt/mysql-client@5.7/bin:$PATH"

使环境变量生效: 

source ~/.zshrc

4、本地安装 mysqlclient

pip install mysqlclient

报错处理:

mac 安装 pip install mysqlclient 报错_做测试的喵酱的博客-CSDN博客

5、在数据库中,需要先手动创建一个库

CREATE DATABASE my_django charset=utf8mb4;

6、在settings.py 文件中,DATABASES 配置数据库信息

DATABASES = {
    'default': {
        # mysql数据库的引擎
        'ENGINE': 'django.db.backends.mysql',
        # 数据库的名称,需要连接mysql下具体某一个数据库的名称
        'NAME': 'my_django',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

三、模型类

1、一般模型类都创建在models.py文件下

2、一个模型类,对应一张表

3、一个类属性,对应表里的一个字段

4、创建表时,会默认创建一个自增主键

类属性与表字段对应关系

类属性表字段
CharFieldvarchar
IntegerFieldint
BooleanFieldbool
TextField长文本

第一步:创建一个模型类

第二步:生成迁移脚本

第三步:执行迁移脚本

3.1、创建模型类&生成迁移脚本&执行迁移脚本

我们以前创建表的时候,是通过sql创建,如

CREATE TABLE table_name 。。。。

现在我们不通过sql,而是通过模型类创建表。

将一个模型类,转换成表。

1、创建一个模型类

类属性,对应数据库表中的字段。

一般模型类都创建在models.py文件下

models.py

from django.db import models

# Create your models here.

class Animal(models.Model):
    # 数据库中varchar类型: 可变字符串,与CharField 对应
    name = models.CharField(max_length=50)
    # 数据库中int类型:与IntegerField 对应
    age = models.IntegerField()
    # bool 类型与 BooleanField 对应
    gender = models.BooleanField()

2、生成迁移脚本

格式:

python manage.py makemigrations 子应用名称

如果不加子应用名称,则对所有的应用都生成迁移脚本

python manage.py makemigrations

如果只想迁移某一个子应用的数据,要指定子应用名称

 举例:

在pycharm 中的 Terminal下执行

python manage.py makemigrations orders

 在orders/migrations/0001_initial.py 生成了迁移脚本

3、执行迁移脚本

模版:

python manage.py migrate 子应用名称

如果后面不加子应用的名称,则会执行所有应用的迁移脚本。

举例:

我只执行oders应用下的迁移脚本

python manage.py migrate orders

执行完成后,可以去数据库中,看到新增的这个表。

生成的表名为 应用名称_小写的类名

4、扩展:将迁移脚本转成sql语句。

模版:

python manage.py sqlmigrate 应用名称 脚本名称

脚本名称,不需要以.py结尾 

举例:

将orders下的 0001_initial.py 脚本,转成sql

python manage.py sqlmigrate orders 0001_initial

3.2 类属性&表字段介绍

属性介绍
verbose_name=''字段的描述“'字段的描述“,好习惯会加verbose_name
help_text='''字段的描述“'字段的描述“,好习惯会加help_text
blank=True允许输入字段为空
null=True允许输入null
default=xx设置字段的默认值为xx
unique=True设置字段属性唯一

3.2.1  models.CharField() 字符串

1、models.CharField() 必须设置max_length=20

3.2.2 时间相关:DateTimeField 与DateField

DateTimeField 与DateField 特有的属性。

auto_now_add=True记录创建这条数据时的时间
auto_now=True记录这条数据更新时的时间

举例:

一条用户的信息数据,有一个创建时间create_time,和数据更新时间 update_time

 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间', help_text='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', help_text='更新时间')

3.2.3 自定义主键 primary_key=True

1、自定义主键 primary_key=True

ids = models.IntegerField(primary_key=True, verbose_name='商品id', help_text='商品id')

在一个模型类中,如果我们没有自定义主键,系统会自动创建一个主键id 。

2、设置自增主键 models.AutoField

id = models.AutoField(primary_key=True, verbose_name='商品id', help_text='商品id')

3.2.4 自定义表名称&内部类&排序

 1、表的名称,默认为 应用名称_小写的类名。

我们想自定义表的名称,通过内部类实现.。

内部类 class Meta:

db_table 是固定写法。

2、表的描述

verbose_name = "商品表"
verbose_name_plural = "商品表"

class Goods(models.Model):
    ids = models.IntegerField(primary_key=True, verbose_name='商品id', help_text='商品id')
    # a.CharField类型必须指定max_length参数(改字段的最大字节数)
    # b.如果需要给一个字段添加唯一约束,unique=True(默认为False)
    name = models.CharField(max_length=20, verbose_name='商品名称', help_text='商品名称',

    # h.可以在任意一个模型类中创建Meta内部类,用于修改数据库的元数据信息
    class Meta:
        # i.db_table指定创建的数据表名称
        db_table = 'tb_goods'
        # 为当前数据表,设置中午呢描述
        verbose_name = "商品表"
        verbose_name_plural = "商品表"

3.2.5 演示 

 1、models.py

from django.db import models

# Create your models here.

class Animal(models.Model):
    # 数据库中varchar类型: 可变字符串,与CharField 对应
    name = models.CharField(max_length=50)
    # 数据库中int类型:与IntegerField 对应
    age = models.IntegerField()
    # bool 类型与 BooleanField 对应
    gender = models.BooleanField()

class Goods(models.Model):
    ids = models.IntegerField(primary_key=True, verbose_name='商品id', help_text='商品id')
    # a.CharField类型必须指定max_length参数(改字段的最大字节数)
    # b.如果需要给一个字段添加唯一约束,unique=True(默认为False)
    name = models.CharField(max_length=20, verbose_name='商品名称', help_text='商品名称',
                            unique=True)
    channel = models.CharField(max_length=10, verbose_name='商品渠道', help_text='商品渠道')

    # c.使用default指定默认值(如果指定默认值后,在创建记录时,改字段传递,会使用默认值)
    on_sale = models.BooleanField(verbose_name='是否在售', help_text='是否在售',
                                     default=True)

    # d.null=True指定前端创建数据时,可以指定该字段为null,默认为null=False,DRF进行反序列化器输入时才有效
    # e.blank=True指定前端创建数据时,可以指定该字段为空字符串,默认为blank=False,DRF进行反序列化器输入时才有效
    desc = models.TextField(verbose_name='商品描述', help_text='商品描述',
                            null=True, blank=True, default='')

    # f.在DateTimeField、DateField等字段中,指定auto_now_add=True,在创建一条记录时,会自动将创建记录时的时间作为该字段的值,后续在更新数据时,就不再修改
    # g.在DateTimeField、DateField等字段中,指定auto_now=True,在更新一条记录时,会自动将更新记录时的时间作为该字段的值
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='商品创建时间', help_text='商品创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='商品更新时间', help_text='商品更新时间')

    # h.可以在任意一个模型类中创建Meta内部类,用于修改数据库的元数据信息
    class Meta:
        # i.db_table指定创建的数据表名称
        db_table = 'tb_goods'

2、生成迁移脚本

python manage.py makemigrations orders

3、执行迁移脚本

python manage.py migrate orders

4、查看新生成的表

5、查看,将迁移脚本转成sql语句。

python manage.py sqlmigrate orders 0002_goods

四、CURD 增删改查

表中,一行数据(一条记录)就是一个模型类的实例对象。

商品goods的模型类如下:

class Goods(models.Model):
    ids = models.IntegerField(primary_key=True, verbose_name='商品id', help_text='商品id')
    # a.CharField类型必须指定max_length参数(改字段的最大字节数)
    # b.如果需要给一个字段添加唯一约束,unique=True(默认为False)
    name = models.CharField(max_length=20, verbose_name='商品名称', help_text='商品名称',
                            unique=True)
    channel = models.CharField(max_length=10, verbose_name='商品渠道', help_text='商品渠道')

    # c.使用default指定默认值(如果指定默认值后,在创建记录时,改字段传递,会使用默认值)
    on_sale = models.BooleanField(verbose_name='是否在售', help_text='是否在售',
                                     default=True)

4.1 新增数据 Create

在tb_goods表里,新增数据。实现方式,类的实例化

方式一: 模型类(字段名1=1值,字段名2=值2,....)

模版:

    obj=Goods(ids="1",name="电脑",channel="电商")
    obj.save()

两行代码,先实例化对象,再调用save方法。

注意:模型类的实例,必须调用save()方法,才会去执行sql

举例:

def get_good_1(request):
    obj=Goods(ids="1",name="电脑",channel="电商")
    obj.save()
    return HttpResponse("传入一条数据")

配置url

path('get_good_1',views.get_good_1)

启动服务,调用接口:

http://127.0.0.1:8000/orders/get_good_1

表里新增了一条数据

方式二:模型类.objects.create(字段名1=1值,字段名2=值2,....)

模板:

Goods.objects.create(ids="2",name="鼠标",channel="线下")

举例:

def get_good_2(request):
    Goods.objects.create(ids="2",name="鼠标",channel="线下")
    return HttpResponse("创建第二条数据")

接口调用该方法,数据库成功新增一条数据

4.2  查询 Read

提前造一批数据,供查询演示

BEGIN;
INSERT INTO `tb_goods` (`ids`, `name`, `channel`, `on_sale`, `desc`, `create_time`, `update_time`) VALUES (1, '电脑', '电商', 1, '', '2023-05-16 09:26:00.350727', '2023-05-16 09:26:00.350855');
INSERT INTO `tb_goods` (`ids`, `name`, `channel`, `on_sale`, `desc`, `create_time`, `update_time`) VALUES (2, '鼠标', '线下', 1, '', '2023-05-16 09:29:52.101118', '2023-05-16 09:29:52.101482');
INSERT INTO `tb_goods` (`ids`, `name`, `channel`, `on_sale`, `desc`, `create_time`, `update_time`) VALUES (3, '插排', '电商', 1, '', '2023-05-16 09:40:30.336316', '2023-05-16 09:40:30.336393');
INSERT INTO `tb_goods` (`ids`, `name`, `channel`, `on_sale`, `desc`, `create_time`, `update_time`) VALUES (4, '充电线', '线下', 1, '', '2023-05-16 09:40:32.963407', '2023-05-16 09:40:32.963456');
INSERT INTO `tb_goods` (`ids`, `name`, `channel`, `on_sale`, `desc`, `create_time`, `update_time`) VALUES (5, '显示器', '电商', 1, '', '2023-05-16 09:41:10.128975', '2023-05-16 09:41:10.129023');
INSERT INTO `tb_goods` (`ids`, `name`, `channel`, `on_sale`, `desc`, `create_time`, `update_time`) VALUES (6, '耳机', '线下', 1, '', '2023-05-16 09:41:07.905568', '2023-05-16 09:41:07.905732');
INSERT INTO `tb_goods` (`ids`, `name`, `channel`, `on_sale`, `desc`, `create_time`, `update_time`) VALUES (7, '可乐', '电商', 1, '', '2023-05-16 09:41:44.799209', '2023-05-16 09:41:44.799275');
INSERT INTO `tb_goods` (`ids`, `name`, `channel`, `on_sale`, `desc`, `create_time`, `update_time`) VALUES (8, '雪碧', '线下', 1, '', '2023-05-16 09:41:42.566164', '2023-05-16 09:41:42.566487');
INSERT INTO `tb_goods` (`ids`, `name`, `channel`, `on_sale`, `desc`, `create_time`, `update_time`) VALUES (9, '笔记本', '电商', 1, '', '2023-05-16 09:42:17.367187', '2023-05-16 09:42:17.367240');
INSERT INTO `tb_goods` (`ids`, `name`, `channel`, `on_sale`, `desc`, `create_time`, `update_time`) VALUES (10, '主机', '线下', 1, '', '2023-05-16 09:42:15.143852', '2023-05-16 09:42:15.144253');
COMMIT;

4.2.1 读取表里所有数据

模板:

模型类.objects.all()

模型类.objects.all() 的返回结果,是将模型类对应的表,表里的所有数据都读出来。

注意,模型类.objects.all() 的返回结果是一个QuerySet对象(查询集对象)

QuerySet 查询集特性:

1、QuerySet对象,类似于列表,具有惰性查询的特性。在调用 模型类.objects.all()=QuerySet对象 时,是不会真正的去执行sql。 当具体去用数据时,才会执行sql语句。

举例:

查询集合

4.2.2 读取单条数据 (不推荐): 模型类.objects.get(条件1=值1)   

方式一

模版:

 qs = 模型类.objects.get(条件1=值1)
# 获取一行数据中,某个字段的值
变量名=qs.类属性名

举例:

tb_goods表中,ids="1"的数据

def get_read_2(request):
    qs = Goods.objects.get(ids="1")
    # 获取一行数据中,某个字段的值
    name = qs.name
    channel = qs.channel

注意:

1、 qs = Goods.objects.get(ids="1") 取出来的数据,qs 的type= <class 'orders.models.Goods'>

就是一个Goods的实例对象。 如果想获取具体某个字段的值,对象.属性名 就可以了

2、使用 模型类.objects.get(条件1=值1)    获取到的数据,必须只能是一条数据。

2.1如果返回结果是多条数据,会抛出异常。 比如查询

Goods.objects.get(name="电脑")

的数据,表里有多条name=电脑的数据,则使用objects.get 获取的数据大于1条,则会抛出异常。

2.2 如果查询条件,没有命中任何数据,也会抛出异常。 比如查询 ids="100"的数据,但是表里不存在ids="100"的数据,则也会抛出异常

所以在使用objects.get 的方法时,要注意try..catch..捕获异常

3、为了保证查询结果,只有一条数据符合条件,在使用条件查询时,最好使用具有唯一约束的条件去查询。比如id 之类的

4.2.3 读取多/单条数据(推荐):objects.filter(条件1=值1)

模版:

qs = 模型类.objects.filter(条件)

1、qs = Goods.objects.filter(ids="1")

返回结果,qs的类型是 QuerySet

2、查询结果无数据时,返回一个空的QuerySet对象

3、获取查询集QuerySet 中的第一条数据

Goods.objects.filter(ids="1")[0] 或者Goods.objects.filter(ids="1").frist()

4、获取查询集QuerySet 的长度

len(Goods.objects.filter(ids="1"))

或者

Goods.objects.filter(ids="1").count()

5、 QuerySet 支持for循环

举例:

def get_read_3(request):
    qs = Goods.objects.filter(ids="1")
    res=qs[0]
    return HttpResponse(qs)

4.2.4   .objects.filter 多种查询类型

1、对字符串查询处理

模版:

字段名__查询类型=具体值

  • 字段名__startswith:以xxx开头
  • 字段名__istartswith:以xxx开头(忽略大小写)
  • 字段名__endswith:以xxx结尾
  • 字段名__isnull:是否为null
  • 字段名__contains:包含
  • 字段名__icontains:包含(忽略大小写)
  • 在列表之内:字段名__in=[xx,xxx]

举例:

查询Student表中,姓名 name ,以姓“张”开头的学生

Students.objects.filter(name__startswith="张")

查询Student表中,姓名 name 中,包含“红” 的姓名信息

Students.objects.filter(name__contains="红")

 Student表中,查询age 年龄 为 16岁  19 岁学生的信息

Students.objects.filter(age__in=[16,19])

2、对数字查询处理

模版:

字段名__查询类型=具体值

  • 大于 gt (greate than) :字段名__gt
  • 小于 lt (less than): 字段名__lt
  • 等于 e (equal): 字段名__e
  • 大于等于 :字段名__gte

举例:

Student表中,查询age 年龄大于等于18的学生信息

Students.objects.filter(age__gte=18)

4.2.5   .objects.exclude 反向查询 (常用)

objects.exclude 与 objects.filter 是相反的,但是查询类型是一模一样的。

举例:

 查询Student表中,姓名 name ,查询 非姓“张”同学的信息

Students.objects.exclude(name__startswith="张")

查询Student表中,姓名 name 中,不包含“红” 的姓名的学生信息

Students.objects.exclude(name__contains="红")

五、QuerySet 介绍

# TODO

六、公共模型类

当我们有多个模型类,其中有很多重复字段时,我们可以把公共的字段提出来,封装成一个公共的类。

举例:

如 order_id 、order_name 两个字段,属于公共字段,很多模型类都会用到。将它封装成公共模型类

1、公共模型类

class BaseModel(models.Model):
    order_id = models.CharField(max_length=10,verbose_name='订单id', help_text='订单id')
    order_name = models.CharField(max_length=10,verbose_name='订单名称', help_text='名称')

    class Meta:
        # 在内部类Meta中,一旦指定abstract = True,那么当前模型类为抽象模型类,在迁移时不会创建表,仅仅是为了供其他类继承
        abstract = True

注意:

内部类下,的 abstract=True 。在内部类Meta中,一旦指定abstract = True,那么当前模型类为抽象模型类,在迁移时不会创建表,仅仅是为了供其他类继承

2、继承

当需要用到这公共字段时,直接继承 公共内部类就可以了。

class Test(BaseModel):

下一章:

django ORM框架 第二章 表与表的关系&关联表_做测试的喵酱的博客-CSDN博客


                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

惊人!2022年我国游戏直播用户规模高达3.82亿人,市场规模1108亿元

随着人们生活水平的提高&#xff0c;人们对娱乐和文化活动的需求也在日益增加&#xff0c;而互联网的快速发展便捷地提供了各种各样丰富多彩的文化和娱乐&#xff0c;也为电子竞技提供了线上直播观看功能&#xff0c;游戏直播逐渐成为社会重要的文化之一。 近年来&#xff0c;…

如何恢复被删除的文件?文件恢复,4招解决!

案例&#xff1a;如何恢复被删除的文件&#xff1f; 【我的一些非常重要的文件保存在电脑中&#xff0c;刚刚一不小心被我删除了&#xff01;请问大家有什么比较可行的被删文件恢复方法吗&#xff1f;】 文件被误删了无法找回会给我们造成很多不便&#xff0c;尤其是重要的文…

JVM 垃圾回收器

GC 分类与性能指标 垃圾收集器概述: 垃圾收集器没有规范中进行过多的规定&#xff0c;可以由不同的厂商、不同版本的 JVM 来实现由于 JDK 的版本处于高速迭代过程中&#xff0c;因此 Java 发展至今已经衍生了众多的 GC 版本从不同角度分析垃圾收集器&#xff0c;可以将 GC 分…

基于语音芯片NV080C方案制作的血氧仪为何实用

随着现代生活水平的提高&#xff0c;人们越来越注重自身的健康状况&#xff0c;而检测血氧和心率数据&#xff0c;成为人们更加重视的健康检测手段之一。血糖仪作为现代化的健康工具&#xff0c;它可以帮助人们更好地了解自己的血糖水平。为方便使用&#xff0c;在血糖仪中加入…

渗透测试--6.1.aircrack-ng破解wifi密码

目录 1.Aircrack-ng简介 1.1 airdump-ng 1.2 aireplay-ng 1.3 aircrack-ng 2.Deauth攻击 3.aircrack-ng工具破解无线网络密码 步骤一&#xff1a;虚拟机连接实验需要用到的网卡 步骤二&#xff1a;设置网卡为监听模式 步骤三&#xff1a;使用wlan0mon网卡扫描附近wif…

Cinema 4D的最佳渲染引擎有哪些?

Cinema 4D是一款专业的3D建模、动画、模拟和渲染软件解决方案。其快速、强大、灵活和稳定的工具集使设计、动态图形、VFX、AR/MR/VR、游戏开发和所有类型的可视化专业人士更容易和高效地使用3D工作流程。除了Cinema 4D附带的标准/物理渲染引擎之外&#xff0c;还有许多用于C4D和…

Android实例——拼图游戏

拼图游戏 项目简介权限adapterPictureListAdapterPuzzleAdapter beanItemBean PresenterIPuzzlePresenterPuzzlePresenterImpl uiIGameCallback utilsConstantImagesUtilsScreenUtils ViewMainActivityPuzzleActivity 布局activity_main.xmlactivity_puzzle.xml 项目简介 选择…

国内 无需科学上网 免费体验 ai 语言交互平台 chatpgt替代(汇总)

ChitGPT CSDN 基于chatgpt 3.5模型 ChitGPT AI EDU - Learn AI, Use AI https://ai.aigcfun.com/ 之前有web端的 现在只有app 和桌面端 通义千问 阿里 通义千问 还没通过审核 360 智脑 360 智脑 体验名额满了 sparkDesk 讯飞 sparkDesk 还没通过审核 文心一言 百度…

行业分析| 快对讲-融合会议的应用

全球经济一体化不断加快&#xff0c;企业也开始注重信息化和现代化建设&#xff0c;无论是企业内部还是外部的沟通与协作都变得非常重要。融合会议为企业提供一种“轻模式”的信息沟通和管理服务。支持语音、视频和数据多媒体通信&#xff0c;实现了语音与数据的无缝融合。用户…

直播预告 | 员工在公司体验感UP,原因竟然是这个......

而随着企业数字化进程的加速&#xff0c;企业账号管理面临着前所未有的挑战。安全性、便捷性和管理效率成为企业管理者关注的重点。 作为公司员工&#xff0c;“打工人”或多或少都面临着不同系统&#xff1a;开发工具、版本控制系统、文档管理系统、项目管理工具......“打工…

LeetCode 637. 二叉树的层平均值

637. 二叉树的层平均值 描述 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 1 0 − 5 10^-\\^5 10−5 以内的答案可以被接受。 示例 示例1 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]…

大家都在用哪些研发协同、沟通协同、项目协同软件?

这里我们将根据需求将协同软件分为&#xff1a;项目管理协作沟通、研发管理协同、文档协同、会议协同、设计协同、沟通协同6个大类进行分别推荐。 随着企业对高效协同办公的需求日益增长&#xff0c;市场上出现了众多协同办公软件。这些软件通过提供各种实用的功能&#xff0c;…

ChatGPT访问互联网,不神秘了

我测试了一下&#xff0c;它其实调用了微软必应的api&#xff0c;搜索了关键词而已 比如我问它&#xff1a;https://twitter.com/elonmusk 马斯克最近在忙什么 它的回答是&#xff1a; 近期&#xff0c;马斯克在做的一些事情包括&#xff1a; 在2023年的特斯拉年度股东大会…

内网渗透(七十七)之域权限维持之ACL滥用(中)

ACL滥用(中) 3、msDS-AllowedToActOnBehalfOfOtherldentity 属性权限 如图所示是微软对于msDS-AllowedToActOnBehalfOfOtherldentity 属性的描述 jack是域中的一个普通用户。现在我们获得了域管理员的权限,并想进行权限维持,可以进行如下的操作:使用Empire下的powerview…

编译zlib

zlib被设计为一个免费的&#xff0c;通用的&#xff0c;法律上不受限制的-即不受任何专利保护的无损数据压缩库&#xff0c;几乎可以在任何计算机硬件和操作系统上使用。 官网&#xff1a;http://www.zlib.net/ 下载zlib源码:http://www.zlib.net/zlib1213.zip 备用地址&#x…

opencv图像拼接

opencv图像拼接是一种在一系列图片中选取部分区域&#xff0c;通过这些区域的重叠得到一个完整的图像&#xff0c;并将这些图片拼接起来的方法。它与传统的方法不同&#xff0c;可以看作是基于拼接技术的图像处理。 opencv是一款开源的图像处理软件&#xff0c;主要用于计算机视…

看模型、做技术交底、做项目汇报,图新说数字化汇报平台引领交互式汇报新模式

现场汇报效果不好&#xff0c;导致丢了一个项目&#xff01; 项目汇报平淡无奇&#xff0c;方案屡次被毙&#xff01; 面对专家质疑&#xff0c;回答苍白无力&#xff01; 估计大家都有过这种经历和感受。 详细分析一下&#xff0c;基本上有以下几个方面的原因&#xff1a; …

ASEMI代理Infineon英飞凌IPB60R099CP原厂MOS管

编辑-Z IPB60R099CP参数描述&#xff1a; 型号&#xff1a;IPB60R099CP 持续漏极电流&#xff1a;31A 脉冲漏极电流&#xff1a;93A 雪崩电流&#xff0c;重复&#xff1a;11A 栅极-源极电压&#xff1a;20V 功率耗散&#xff1a;255W 操作和储存温度&#xff1a;-55 t…

Springer期刊 latex投稿经验分享

Springer Nature期刊的latex模板下载: Download the journal article template package 以MTAP为例(修改之后对修订稿的投递过程) 第一步:将您的文章提交到适当的期刊轨道或特刊。 如有必要,从下拉菜单中更改您提交的文章类型。 然后点击Proceed 第二步: 与您提交的先前修…

Jmeter +Maven+jenkins 接口性能全自动化测试

背景&#xff1a; 首先用jmeter录制或者书写性能测试的脚本&#xff0c;用maven添加相关依赖&#xff0c;把性能测试的代码提交到github&#xff0c;在jenkins配置git下载性能测试的代码&#xff0c;配置运行脚本和测试报告&#xff0c;配置运行失败自动发邮件通知&#xff0c…