Django与数据库
我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步
今天来讲一讲alpha策略制定后的测试问题
mysql配置
Django模型体现了面向对象的编程技术,是一种面向对象的编程语言和不兼容类型能相互转化的编程技术,这种技术也叫ORM(Object Relation Mapping,ORM)对象关系映射,Django的ORM功能十分强大,极大提高了开发效率
在Django当中配置数据库的连接非常简单
settings.py文件当中会提前为你创建好一个DATABASE(类型为字典):
# 这是settings.py的内容DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', # 配置引擎'OPTIONS': {'read_default_file': '/path/to/my.cnf', # 配置文件路径},'USER': 'yonghu', # 数据库用户名'PASSWORD': 'mima', # 数据库密码'HOST': '127.0.0.1', # 数据库服务监听IP'PORT': '3306', # 数据库服务监听端口'NAME': 'data', # 数据库名字}}
配置连接有一定顺序
如果配置中定义了OPTIONS,其中定义的连接信息则会优先被使用,如果没有定义OPTIONS,则配置当中的USER、NAME、PASS WORD、HOST、PORT等信息会依次被使用到
DATABASE定义的数据库数量不受限制,但是必须定义一个名为default的数据库,数据库支持如下配置:
ENGINE:配置定义数据库后端:Django自带支持的后端有:PostgreSQL、MYSQL、SQLite、Oracle
HOST:指定连接数据库的主机地址,空字符串则输出默认的地址localhost,也可以使用指定用于连接的套字路径
NAME:数据库名
CONN_MAX_AGE:一个连接的周期,比如设置为5,则会在请求结束5秒后段开连接
OPTIONS:默认为空,用于连接字典的额外参数
PASSWORD:数据库密码,默认为空(用环境变量)
PORT:数据库的端口号
USER:连接数据库的用户名
连接池
在客户端向服务器发出访问请求以后,需要建立一个到数据端的连接,每进行一次访问操作,就会创建一个连接,在mysql当中,这样的连接由max_connection来配置。大部分情况下,这种连接是网络连接,链接过程当中会使用网络套接字,这是一个耗时的操作,大大增加了服务器的压力,为了缓解这种问题,我们可以使用连接池,也就是将数据库连接放到应用程序的缓存当中,在应用程序需要多数据库发出请求时,先从连接池获取连接,再使用这个连接请求数据库
简单来讲,连接池就是通过预先创建一些保持长期为打开状态的接口,从而减少频繁开关连接的开销,Django在首次进行数据库连接后,这个连接会长期在打开状态,只有当超过生命时间周期后才会被关闭,Django本身也并不具备连接池功能,但我们可以通过第三方库来实现,例如django-db-connection-pool 、psycopg2-binary、django_db_polling
实操
不同的库对于连接池的配置有不同的要求,这里用django-db-connection-pool
首先先下载:
pip install django-db-connection-pool
然后在settings.py当中添加相应的配置:
# settings.pyINSTALLED_APPS = [...'django_db_connection_pool',...]DATABASES = {'default': {'ENGINE': 'django_db_connection_pool.backends.mysql', # 使用连接池的数据库引擎'NAME': 'your_database_name','USER': 'your_database_user','PASSWORD': 'your_database_password','HOST': 'localhost','PORT': '3306','POOL_OPTIONS': {'POOL_SIZE': 10, # 连接池大小'MAX_OVERFLOW': 20, # 最大溢出连接数},}}
Django迁移工具
Django提供的迁移工具可以将对模型所做的更改应用到数据库,从而修改对应的表单和数据库,Django当中提供了三个常用命令,分别是migrate、makemigration、sqlmigrate
其中,migrate命令负责将迁移应用到数据库;makemigration负责将模型变动转换成迁移;sqlmigrate会输出应用变动时实际执行的SQL语句。
具体使用:
1.`makemigrations`命令
`makemigrations`用于生成迁移文件,将模型的变更转换为迁移脚本。
基本用法
python manage.py makemigrations
此命令会检查所有已安装应用的模型定义,与数据库当前状态进行比较,并生成必要的迁移文件。
指定应用
如果只想为特定应用生成迁移文件,可以指定应用名称:
python manage.py makemigrations your_app_name
这会为`myapp`应用生成迁移文件。
查看迁移计划
在生成迁移文件之前,可以使用`--plan`选项查看即将执行的迁移操作:
python manage.py makemigrations --plan
这有助于了解迁移的具体内容。
2.`migrate`命令
`migrate`用于将迁移文件应用到数据库,更新数据库结构以匹配模型。
基本用法
python manage.py migrate
此命令会应用所有未应用的迁移文件。
指定应用
如果只想应用特定应用的迁移,可以指定应用名称:
python manage.py migrate your_app_name
这会只应用`myapp`应用的迁移。
3.`sqlmigrate`命令
`sqlmigrate`用于查看特定迁移文件对应的 SQL 语句,但不会实际执行这些语句。
基本用法
python manage.py sqlmigrate app_name migration_name
例如,查看`myapp`应用中名为`0001_initial`的迁移文件的 SQL 语句:
python manage.py sqlmigrate myapp 0001
这会输出该迁移文件对应的 SQL 语句。
进阶用法
• 指定数据库:
python manage.py sqlmigrate myapp 0001 --database=secondary_db
这会在多数据库环境中指定数据库。
• 列出迁移文件:
python manage.py sqlmigrate myapp --list
这会列出所有可用的迁移文件及其状态。
通过以上命令,你可以有效地管理 Django 项目的数据库迁移,确保模型与数据库结构始终保持一致。
数据库创建完成,Django会自动为模型提供一个数据库抽象API,允许创建,检索,更新和删除对象,因此,我们不需要学习mysql语言,仅仅靠Django当中提供的函数就能实现对数据库的增删改查操作,不管是增删还是改查,首先要对数据库进行保存,所以我们要学习Django当中的save()方法
简单案例:
python manage.py shellfrom myapp.models import Personperson = Person(name="Alice", age=30)person.save()
在该案例中在数据库当中新写入了一个person对象,同时,会自动获取一个自增的主键
获取数据表当中的对象:
all_products =Product.objects.all()
通过过滤器获取符合条件的子集:
Product.objects.filter(date_created__year=2018)
多个过滤器连接:
Product.objects.filter(date_created__year=2018).exclude(date_created__month=12)
这在sql里面是AND的语句表达,如果想用OR语句查询可以使用Q对象:
Product.objects.filter(Q(title__startswith="Women") | (Q(date_created=date(2005, 5, 2)) | Q(date_created=date(2005, 5, 6))))
这段代码的目的是从一个名为 Product 的模型中检索一个对象,该对象满足以下条件之一:• 标题以"Women"开头。• 创建日期为2005年5月2日或2005年5月6日。
懒加载和缓存
QuerySet采用懒加载的机制(只有要用到结果时才会访问数据库),因此,访问数据库时,要采用遍历、切片、len()、list()、bool()等方式进行访问,为了降低数据库的负荷,每个QuerySet都会保留一份缓存
>>> print([p.date_created for p in Product.objects.all()]) >>> print([p.title for p in Product.objects.all()])
因此,两次输入 print([p.date_created for p in Product.objects.all()]) 的结果很可能不同
也可以只是对数据集做一些简单的运算并返回结果(可以用count()查询数量,用Avg查询平均值等等)
数据库事务
将数据库上的许多操作,例如读取数据库、对象、写入、获取锁封装成一个工作单元,整个单元内的操作要么都成功,要么都失败,这就叫事务,在Django当中,提供了控制数据库事务管理的方法,要启用其中将每一个请求包装在事务中的功能,可以在数据库的配置中设置:ATOMIC_REQUESTS为TRUE来开启此功能
此功能的大概工作流程如下:调用视图函数之前,Django会启动一个事务,如果生成的响应没有问题,Django就提交事务,否则就会回滚事务
(也可以使用atomic()上下文管理器):
from django.db import transactiondef my_view(request):try:with transaction.atomic():# 在这里执行数据库操作...except Exception as e:# 处理异常,事务会自动回滚...return HttpResponse('Success or Error')from django.db import transaction@transaction.atomic # 作为装饰器使用def viewfunc(request):do_stuff()def anotherviewfunc(request):with transaction.atomic(): # 作为上下文管理器使用do_more_stuff()
需要注意:视图函数的执行包含在事务当中,但中间件和模板的渲染是在事务之外运行的
自动提交
自动提交(Autocommit)模式是指数据库在执行每个单独的 SQL 语句后立即将其提交到数据库。这意味着每个操作都是一个独立的事务,没有事务的开始和结束控制。这种模式通常用于简单的数据库操作,其中不需要复杂的事务控制。在 Django 中,默认情况下,数据库操作是自动提交的。这意味着如果你不显式地使用事务管理,每个数据库操作(如 .save() , .delete() , .update() 等)都会立即被提交。
可以在配置文件当中设置禁止
AUTOCOMMIT = False
提交后执行操作
在数据库操作中,"提交后执行操作"通常指的是在事务提交之后执行某些特定的操作。在 Django 中,这可以通过几种方式实现:
1.使用信号(Signals)
Django 的信号机制允许你在执行特定操作后发送信号,其他接收者可以监听这些信号并执行相应的操作。例如,你可以在事务提交后发送一个信号。
from django.db import transactionfrom django.db.models.signals import post_savefrom django.dispatch import receiver@receiver(post_save, sender=MyModel)def my_model_saved(sender, instance, **kwargs):# 这个函数会在 MyModel 实例保存后执行# 确保在事务提交后执行if kwargs.get('created', False):# 实例创建后执行的操作pass# 在视图中使用事务def my_view(request):try:with transaction.atomic():my_model_instance = MyModel.objects.create(...)# 其他数据库操作...except Exception as e:# 处理异常pass
2.使用`transaction.on_commit`回调
Django 3.6+引入了`transaction.on_commit`回调,允许你在事务提交时执行某些操作。
from django.db import transactiondef my_view(request):def callback():# 事务提交后执行的操作passtry:with transaction.atomic():my_model_instance = MyModel.objects.create(...)# 其他数据库操作...transaction.on_commit(callback)except Exception as e:# 处理异常pass
在这个例子中,`callback`函数将在事务成功提交后执行。
3.使用数据库触发器(Triggers)
对于更复杂的场景,你可以在数据库层面使用触发器(Triggers)。触发器是数据库对象,它们在特定事件发生时自动执行。例如,你可以创建一个触发器,在插入或更新记录后执行某些操作。
CREATE TRIGGER after_insert_my_modelAFTER INSERT ON my_modelFOR EACH ROWBEGIN-- 执行操作END;
请注意,使用触发器需要对数据库有更深入的了解,并且不同数据库的触发器语法可能不同。
注意事项
• 确保在事务提交后执行的操作不会违反事务的隔离性或一致性。
• 使用信号或回调时,确保它们不会引入死锁或循环依赖。
• 在使用触发器时,确保它们不会与应用逻辑冲突。
通过这些方法,你可以在 Django 中实现在事务提交后执行特定操作的需求。选择哪种方法取决于你的具体场景和偏好。
数据库并发控制
多用户同时访问和更改数据库可能会引发冲突,因此,要协调同步事务,在两个活动尝试修改同一个数据库的对象时,有三种情况,两个活动会相互干扰:
- 脏读:事务A读取到了事务B的修改后尚未提交的数据,但事务B如果最后没有选择提交,那这种读取方式就叫脏读
- 不可重复读:多次读取同一个数据,两次读取结果不一致,这种情况一般发生在其他事务对该数据进行修改并提交
- 幻读:A查询后的下一刻数据库被更改,导致查询结果不准确
越是允许缓存当中的过时数据存在,则并发的线程/问题就越多,可能出现的问题也就越大
这会导致什么问题?具体举个例子,A访问数据库时余额为10,然后B也访问了数据库,A从中取出3,也就是原数据库改为7,但B如果进行存5的操作,此时由于数据库并发的问题,B修改数据库为10+5=15。
为了杜绝此类问题出现,需要确保正在处理的资源在工作时不会发生改变
悲观锁
是指实体在应用中存储的整个周期,数据库都处于锁定状态,以此来限制其他用户使用这个数据库当中的实体
可以是修改数据库的人不希望其他人再次过程当中读取实体,也可以是读取数据库的人不希望其他人在此过程当中修改实体
锁的范围可能是整个数据库、表、多行或单行。这些锁分别称为数据库锁、表锁、页锁和行锁。
优点是简单易用,缺点是当用户数量过多时该方法限制了可同时操作的用户数量
在Django中实现悲观锁可以通过`select_for_update()`方法来完成,它利用数据库的行级锁机制,确保在事务提交或回滚之前,其他事务无法修改被锁定的行。
实现步骤
1. 使用`transaction.atomic()`装饰器:确保操作在一个事务中完成,如果操作失败,事务会自动回滚。
2. 调用`select_for_update()`方法:对查询结果加锁,锁定特定的行。
3. 执行业务逻辑:在锁定期间对数据进行修改。
4. 提交或回滚事务:如果操作成功,事务提交;如果失败,事务回滚。
示例代码
以下是一个使用悲观锁的Django视图函数示例,模拟秒杀场景:
from django.db import transactionfrom django.http import HttpResponsefrom .models import Book, Orderimport timeimport random@transaction.atomicdef seckill(request):sid = transaction.savepoint() # 设置保存点book = Book.objects.select_for_update().filter(pk=1).first() # 加行锁if book.count > 0:print('库存可以,下单')Order.objects.create(order_id=str(time.time()), order_name='测试订单')time.sleep(random.randint(1, 4)) # 模拟延迟book.count -= 1book.save()transaction.savepoint_commit(sid) # 提交事务return HttpResponse('秒杀成功')else:transaction.savepoint_rollback(sid) # 回滚事务return HttpResponse('库存不足,秒杀失败')
注意事项
1. 锁的粒度:`select_for_update()`默认加行级锁,但如果查询条件未指定主键或唯一索引,可能会升级为表锁。
2. 死锁风险:在高并发场景下,悲观锁可能导致死锁。需要合理设计事务逻辑,避免长时间持有锁。
3. 数据库支持:`select_for_update()`需要数据库支持事务和行级锁,如MySQL的InnoDB引擎。
通过这种方式,Django可以利用数据库的锁机制实现悲观锁,确保在并发场景下数据的一致性和完整性。
乐观锁
在冲突发生不频繁时,可以考不阻止并发控制,而是选择检测冲突,并且在冲突发生时去解决他
updated = Account.objects.filter(id=self.id,version=self.version,).update(balance=F('balance') + amount,version=F('version') + 1,)
在原本定义的模型上多加上一个version,update语句其实暗含了检查版本的功能(因为会先检查version字段与传入的version字段是否匹配,只有匹配才会执行更改)
解决冲突的基本途径有:放弃、展示问题让客户决定、合并改动、记录冲突让后来的人决定、无视冲突直接覆盖,在不同的情况下,我们可以选择不同的锁和不同的策略
数据库扩展
纵向扩展
简单来说,数据库的扩展就是让数据库能够处理更多流量和更多读写查询,主流的扩展方法有纵向扩展和横向扩展,纵向扩展采用的是增强单个数据库能力的方法(增强cpu、内存、存储空间等等)
优点:应用层不需要适配;缺点:硬件扩容有上限,成本高
横向扩展
横向扩展采用的是将多个数据库组合起来的方法,和纵向扩展相比,此发可用性高,易于升级且成本低廉,缺点是对技术要求高并且要求对应用层做出更改
几种横向扩展的方法
读写分离
读写分离主要用到了MYSQL的复制功能
允许将一个来自MYSQL数据库服务器的数据自动复制到一个或多个MYSQL数据库服务器,该功能需要在修改Django配置的同时对于MYSQL也做出小的修改,效果是当一台数据库服务宕机后,能通过调整另外一台库以最快的速度恢复服务,由于主从复制是单向的,因此只有主数据库用于写操作,而读操作则可以在多个数据库上进行,因此,我们至少需要两个数据库,一个用于读操作,另一个用于写操作,要使复制功能正常工作,首先要把复制事件写入日志,一般称这个日志为Binlog,每当从数据库连接到主数据库,主数据库就会创建新的线程,然后执行服务器对他的请求,大多请求会是将Binlog传给从服务器并且通知从服务器有新的Binlog写入
从服务器会起两个线程来处理复制,一个称I/O线程,负责连接到主服务器从中读取二进制日志事件(中继日志),另一个称SQL线程,负责在本地的中继日志当中读取事件,然后本地执行
在Django当中提供了多数据库请求路由来实现读写分离
使用步骤如下:
- 修改settings.py当中的DATABASES列表
DATABASES = {'default': { # 默认数据库,主数据库'NAME': 'multidb','ENGINE': 'django.db.backends.mysql','USER': 'some_user', # 数据库账号'PASSWORD': 'some_password', # 数据库密码'HOST': 'master_host_ip', # 数据库IP},'slave': { # 从数据库'NAME': 'multidb','ENGINE': 'django.db.backends.mysql','USER': 'some_user', # 数据库账号'PASSWORD': 'some_password', # 数据库密码'HOST': 'slave_host_ip' # 数据库IP}}
- 将写操作应用到主数据库,读操作应用到从数据库
import randomclass RandomRouter:def db_for_read(self, model, **hints):return random.choice(['replica1', 'replica2']) # 随机选一个从数据库
- 在settings.py当中加上
DATABASE_ROUTERS = ['path.to.DefaultRouter']
垂直分库
比较常见的一种做法是将不同的模块放在不同的数据库中。
通过路由,将不同模块的请求转到不同的数据库当中,首先在settings.py当中配置多个数据库:
DATABASES = {'default': {},'auth_db': {'NAME': 'auth_db','ENGINE': 'django.db.backends.mysql',# 其他配置...},'product_db': {'NAME': 'product_db','ENGINE': 'django.db.backends.mysql',# 其他配置...},'order_db': {'NAME': 'order_db','ENGINE': 'django.db.backends.mysql',# 其他配置...},}
然后根据模型的不同路由请求到不同的数据库
class MultiDatabaseRouter:def db_for_read(self, model, **hints):if model == User: # 请求用户数据库return 'auth_db'elif model == Product: # 请求商品数据库return 'product_db'elif model == Order: # 请求订单数据库return 'order_db'else:return 'default'
在settings.py当中加上
DATABASE_ROUTERS = ['path.to.MultiDatabaseRouter']
水平扩展
当用户数量达到一定规模,单个数据库或数据表无法容纳用户的全部数据,常见的做法就是对数据库中的数据进行水平分区,每个单独的分区称为分片
每个分片承载单独的数据库,以分散负载
分片操作虽然提高了查询性能,单本身也使应用层变得极其复杂,采用该策略需要慎重考虑
常见的分片方式有算法分片和动态分片——算法分片是让数据通过算法写入不同分片,动态分片则需要客户端读取其他存储,确认分片信息,最简单的算法分片是取模算法,因为笔者做不到每天300万的用户访问量所以这部分咱就不讨论了...
相关文章:
Django与数据库
我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲alpha策略制定后的测试问题 mysql配置 Django模型体现了面向对象的编程技术,是一种面向对象的编程语言和不兼容类型能相互转化的编程技术,这种技术也叫ORM&#…...
力扣热题 100:二叉树专题进阶题解析(后7道)
系列文章目录 力扣热题 100:哈希专题三道题详细解析(JAVA) 力扣热题 100:双指针专题四道题详细解析(JAVA) 力扣热题 100:滑动窗口专题两道题详细解析(JAVA) 力扣热题 100:子串专题三道题详细解析(JAVA) 力…...
Linux——system V共享内存
共享内存区是最快的IPC(进程内通信)形式,不再通过执行进入内核的系统调用来传递彼此的数据 1.共享内存的原理 IPC通信的本质是让不同的进程先看到同一份资源,然后再进行通信,所以想要通过共享内存进行通信,那么第一步一定是让两个…...
【C语言】指针篇
目录 C 语言指针概述指针的声明和初始化声明指针初始化指针 指针的操作解引用操作指针算术运算 指针的用途动态内存分配作为函数参数 指针与数组数组名作为指针通过指针访问数组元素指针算术和数组数组作为函数参数指针数组和数组指针指针数组数组指针 函数指针函数指针的定义和…...
XGBoost介绍
XGBoost:是eXtreme Gradient Boosting(极端梯度提升)的缩写,是一种强大的集成学习(ensemble learning)算法,旨在提高效率、速度和高性能。XGBoost是梯度提升(Gradient Boosting)的优化实现。集成学习将多个弱模型组合起来,形成一个…...
力扣:找到一个数字的 K 美丽值(C++)
一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目: 子字符串长度为 k 。子字符串能整除 num 。 给你整数 num 和 k ,请你返回 num 的 k 美丽值。 注意: 允许有 前缀 0 。0 不能整除任何值。 一个 子字符串 是一个字符串里…...
数据结构:有序表的合并
前文介绍了《有序表的插入》,本文介绍有序表的合并。这两种对有序表的操作,是数据结构中常考的内容,特别是在 408 考卷中,在算法设计的题目中,有可能会考查对有序表的操作。那么,这两篇文章中的方法就是能够…...
AI写论文提示词指令大全,快速写论文
目录 一、十大学术写作提示词1、研究主题2、研究问题3、论文架构4、学术论证5、文献关键要素6、专业文本可读性转换7、学术语言规范化8、提高语言准确性9、多维度、深层论证10、优化文本结构 二、快速写论文提示词1、确认研究选题2、整理相关资料3、快速完成论文大纲4、整合文献…...
物联网IoT系列之MQTT协议基础知识
文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么?什么是MQTT?为什么说MQTT是适用于物联网的协议?MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …...
【从零开始学习计算机科学】计算机组成原理(七)存储器与存储器系统
【从零开始学习计算机科学】计算机组成原理(七)存储器与存储器系统 存储器存储器相关概念存储器分类存储器系统存储器性能指标存储器层次概述程序访问的局部性原理SRAM存储器存储器的读写周期DRAM存储器DRAM控制器高性能的主存储器存储器扩展只读存储器ROM光擦可编程只读存储…...
ctf-WEB: 关于 GHCTF Message in a Bottle plus 与 Message in a Bottle 的非官方wp解法
Message in a Bottle from bottle import Bottle, request, template, runapp Bottle()# 存储留言的列表 messages [] def handle_message(message):message_items "".join([f"""<div class"message-card"><div class"me…...
Java集合_八股场景题
Java集合 在Java开发中,集合框架是面试和实际开发中非常重要的内容。以下是一些常见的Java集合八股文问题和场景题,以及详细答案和示例代码。 1. Java集合框架的结构是什么? 答案: Java集合框架主要分为三大接口:Col…...
Scaled_dot_product_attention(SDPA)使用详解
在学习huggingFace的Transformer库时,我们不可避免会遇到scaled_dot_product_attention(SDPA)这个函数,它被用来加速大模型的Attention计算,本文就详细介绍一下它的使用方法,核心内容主要参考了torch.nn.functional中该函数的注释…...
SpringBoot(一)--搭建架构5种方法
目录 一、⭐Idea从spring官网下载打开 2021版本idea 1.打开创建项目 2.修改pom.xml文件里的版本号 2017版本idea 二、从spring官网下载再用idea打开 三、Idea从阿里云的官网下载打开 编辑 四、Maven项目改造成springboot项目 五、从阿里云官网下载再用idea打开 Spri…...
初识大模型——大语言模型 LLMBook 学习(一)
1. 大模型发展历程 🔹 1. 早期阶段(1950s - 1990s):基于规则和统计的方法 代表技术: 1950s-1960s:规则驱动的语言处理 早期的 NLP 主要依赖 基于规则的系统,如 Noam Chomsky 提出的 生成语法&…...
Array and string offset access syntax with curly braces is deprecated
警告信息 “Array and string offset access syntax with curly braces is deprecated” 是 PHP 中的一个弃用警告(Deprecation Notice),表明在 PHP 中使用花括号 {} 来访问数组或字符串的偏移量已经被标记为过时。 背景 在 PHP 的早期版本…...
27. Harmonyos Next仿uv-ui 组件NumberBox 步进器组件禁用状态
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 文章目录 1. 组件介绍2. 效果展示3. 禁用状态设置3.1 整体禁用3.2 输入框禁用3.3 长按禁用 4. 完整示例代码5. 知识点讲解5.1 禁用状态属性5.2 禁用…...
Java高频面试之集合-08
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:详细说说CopyOnWriteArrayList CopyOnWriteArrayList 详解 CopyOnWriteArrayList 是 Java 并发包(java.util…...
做到哪一步才算精通SQL
做到哪一步才算精通SQL-Structured Query Language 数据定义语言 DDL for StructCREATE:用来创建数据库、表、索引等对象ALTER:用来修改已存在的数据库对象DROP:用来删除整个数据库或者数据库中的表TRUNCATE:用来删除表中所有的行…...
SpringAI介绍及本地模型使用方法
博客原文地址 前言 Spring在Java语言中一直稳居高位,与AI的洪流碰撞后也产生了一些有趣的”化学反应“,当然你要非要说碰撞属于物理反应也可以, 在经历了一系列复杂的反应方程后,Spring家族的新成员——SpringAI,就…...
空指针异常的触发
面向对象分析: 当你要吃饭,饭是对象,提供吃饭这个功能,所以饭为null时,你去调吃饭这个功能,就是去操作饭这个抽象模型,但这个模型是null,就是空指针异常了,但如果有了饭…...
尚硅谷爬虫note15n
1. 多条管道 多条管道开启(2步): (1)定义管道类 (2)在settings中开启管道 在pipelines中: import urllib.request # 多条管道开启 #(1)定义管道类 #(2)在setti…...
基于SSM+Vue的汽车维修保养预约系统+LW示例
1.项目介绍 系统角色:管理员、员工、用户功能模块:用户管理、员工管理、汽车类型管理、项目类型管理、维修/预约订单管理、系统管理、公告管理等技术选型:SSM,vue(后端管理web),Layuiÿ…...
【商城实战(13)】购物车价格与数量的奥秘
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
在线json转ArkTs-Harmonyos
轻松将 JSON 数据转换为类型安全的 ArkTs 接口。快速准确地生成代码,提升开发效率,告别手动编写,让您的开发流程更加流畅! gotool...
Cannot resolve symbol ‘view‘ Androidstudio报错解决办法
报错原因 出现 Cannot resolve symbol view 错误是因为代码中的 view 变量未正确定义或不在当前作用域内。以下是常见场景和解决方法: 场景 1:在 点击事件监听器 中获取 view 如果代码在 OnClickListener 的 onClick 方法中,view 是方法的参…...
三级缓存架构
三级缓存架构是一种通过分层缓存设计来优化系统性能、降低数据库负载、提高数据访问效率的解决方案,尤其适用于高并发、高吞吐量的业务场景(如电商、社交平台、实时推荐等)。其核心思想是通过多级缓存逐层过滤请求,减少对底层存储…...
webshell一些上传心得
我们以upload-labs为基础 一、前端拦截: 如第一关 工作方式: 直接在前端拦截 绕过方式: 因为没有限制后端,所有可以用bs 绕过前端修改格式即可 将需要上传的php文件改成jpg格式 使用burp suite 拦截上传后,使用re…...
doris:阿里云 MaxCompute
MaxCompute 是阿里云上的企业级 SaaS(Software as a Service)模式云数据仓库。 什么是 MaxCompute 连接 MaxCompute 示例 -- 1. 创建Catalog。 CREATE CATALOG mc PROPERTIES ("type" "max_compute","mc.default.projec…...
MyBatis-Plus 分页查询接口返回值问题剖析
在使用 MyBatis-Plus 进行分页查询时,很多开发者会遇到一个常见的问题:当分页查询接口返回值定义为 Page<T> 时,执行查询会抛出异常;而将返回值修改为 IPage<T> 时,分页查询却能正常工作。本文将从 MyBatis-Plus 的分页机制入手,详细分析这一问题的根源,并提…...
【面试】框架
框架 1、介绍一下Spring 的 IOC2、将一个类声明为 Bean 的注解有哪些3、Bean 的作用域有哪些4、Spring 框架中的 Bean 是线程安全的吗5、Spring 容器对象的懒加载6、Spring 容器中的 bean 生命周期7、谈谈自己对于 Spring DI 的了解8、注入 Bean 的注解有哪些9、Spring Boot 如…...
MWC 2025 | 紫光展锐联合移远通信推出全面支持R16特性的5G模组RG620UA-EU
2025年世界移动通信大会(MWC 2025)期间,紫光展锐联合移远通信,正式发布了全面支持5G R16特性的模组RG620UA-EU,以强大的灵活性和便捷性赋能产业。 展锐芯加持,关键性能优异 RG620UA-EU模组基于紫光展锐V62…...
《苍穹外卖》SpringBoot后端开发项目重点知识整理(DAY1 to DAY3)
目录 一、在本地部署并启动Nginx服务1. 解压Nginx压缩包2. 启动Nginx服务3. 验证Nginx是否启动成功: 二、导入接口文档1. 黑马程序员提供的YApi平台2. YApi Pro平台3. 推荐工具:Apifox 三、Swagger1. 常用注解1.1 Api与ApiModel1.2 ApiModelProperty与Ap…...
Mysql内置函数
日期函数: 例如: select current_date();---打印日期 select current_time()----打印时间 select current_timestamp();打印时间戳 select now(); ----日期时间 select date(‘2020-10-01 00:00:00’); ----提取日期进行打印: 也可以配合…...
一文了解汽车图像传感器
2024年底,安森美做了题为"How Automotive Image Sensors Transform the Future of Autonomous Driving"的演讲,这里结合其内容对自动驾驶图像传感器做一个介绍。 当前的自动驾驶感知技术主要有两大技术路线:一种是仅使用摄像头作为传感器进行信息采集的纯…...
cocos creator使用mesh修改图片为圆形,减少使用mask,j减少drawcall,优化性能
cocos creator版本2.4.11 一个mask占用drawcall 3个以上,针对游戏中技能图标,cd,以及多玩家头像,是有很大优化空间 1.上代码,只适合单独图片的,不适合在图集中的图片 const { ccclass, property } cc._decorator;c…...
面向高质量视频生成的扩散模型方法-算法、架构与实现【附核心代码】
目录 算法原理 架构 代码示例 算法原理 正向扩散过程:从真实的视频数据开始,逐步向其中添加噪声,随着时间步 t 的增加,噪声添加得越来越多,最终将原始视频数据变成纯噪声。数学上,t 时刻的视频数据与 t…...
vue3框架的响应式依赖追踪机制
当存在一个响应式变量于视图中发生改变时会更新当前组件的所以视图显示,但是没有视图中不写这个响应式变量就就算修改该变量也不会修改视图,这是为什么?我们能否可以理解宽泛的理解为vue组件的更新就是视图的更新,单当视图中不存在…...
Ubuntu本地部署Open manus(完全免费可用)
目录 1.介绍 2.环境搭建 3.更改配置 4.运行 1.介绍 关于由于邀请码的限制,导致很多用户无法顺利体验manus带来的ai agent体验,但是最近开源的open manus是另一个不错的选择。 先来看看运行的结果: 我让open manus帮我打开小米的主页&am…...
MacOS Big Sur 11 新机安装brew wget python3.12 exo
MacOS Big Sur 11,算是很老的系统了,所以装起来brew有点费劲。 首先安装brew 官网: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 官网加速: 按照官网的方法࿰…...
基于USB Key的Web系统双因素认证解决方案:构建安全与便捷的登录体系
摘要 在网络安全威胁日益严峻的背景下,传统的“用户名密码”认证方式已难以应对钓鱼攻击、密码窃取等风险。上海安当基于USB Key技术,推出了一套面向Web系统的双因素认证解决方案,通过硬件与密码学的深度融合,实现用户身份的高强度…...
项目工坊 | Python驱动淘宝信息爬虫
目录 前言 1 完整代码 2 代码解读 2.1 导入模块 2.2 定义 TaoBao 类 2.3 search_infor_price_from_web 方法 2.3.1 获取下载路径 2.3.2 设置浏览器选项 2.3.3 反爬虫处理 2.3.4 启动浏览器 2.3.5 修改浏览器属性 2.3.6 设置下载行为 2.3.7 打开淘宝登录页面 2.3.…...
数据安全_笔记系列12:数据访问控制中的三个管理员权限划分
数据安全_笔记系列04:数据访问控制中的“三权分立”机制详解 文章链接:https://blog.csdn.net/fen_fen/article/details/145852242 数据安全_笔记系列12:数据访问控制中的三个管理员权限划分 这三个角色的职责和权限划分。 系统应具有相互独…...
通义千问本地配置并实现微调
通义千问本地配置并实现微调 最小Qwen模型大小942mb from modelscope import snapshot_download model_dir = snapshot_download(“qwen/Qwen2.5-0.5B”, cache_dir=“./models2.5”) Qwen2.5-0.5B:942MB from modelscope import snapshot_download model_dir = snapshot_d…...
文件上传漏洞(upload靶场)
目录 Pass-01:前端绕过 方法一:浏览器禁用js 方法二:直接修改或删除js脚本 方法三:修改后缀绕过 Pass-02:服务器检测 Pess-03:黑名单绕过 Pass-04:.htaccess文件 Pass-05:windows特性和user.ini 方法一:php.自动解析为ph…...
Leetcode 刷题记录 05 —— 普通数组
本系列为笔者的 Leetcode 刷题记录,顺序为 Hot 100 题官方顺序,根据标签命名,记录笔者总结的做题思路,附部分代码解释和疑问解答。 目录 01 最大子数组和 方法一:动态规划(卡达尼算法) 方法…...
随机过程的核心概念与Matlab实现
摘要 本文系统讲解随机过程的核心理论与Matlab实现,涵盖随机变量分布、蒙特卡罗仿真、信息熵计算及平稳过程特性。通过高斯、瑞利分布的生成代码、蒙特卡罗积分估计、窄带信号仿真等案例,结合功率谱分析与自相关函数推导,演示随机过程建模与…...
git worktree的使用
git worktree 是 Git 提供的一个强大功能,允许你在同一个仓库中同时创建多个工作目录,每个目录对应一个分支,从而实现并行开发。以下是 git worktree 的常用命令和使用方法: 1. 创建新的工作目录(Worktree)…...
delphi 正则提取html中的内容
function ExtractTextFromHTML(const HTML: string): string; var RegEx: TRegEx; begin Result := HTML; // 移除<script>标签及其内容 Result := TRegEx.Replace(Result, <script.*?>.*?</script>, , [roIgnoreCase, roSingleLine]); // 移除<s…...
深度学习系列79:Text2sql调研
参考 https://github.com/topics/text-to-sql 这里是一些资源:https://github.com/eosphoros-ai/Awesome-Text2SQL/blob/main/README.zh.md 这里是综述文章:https://zhuanlan.zhihu.com/p/647249972 1. 数据集 Spider: 一个跨域的复杂text2sql数据集&a…...