一文帮助快速入门Django

文章目录

  • 创建django项目
  • 应用app
    • 配置pycharm
    • 虚拟环境
    • 打包依赖
  • 路由
    • 传统路由
    • include路由分发
    • name
    • namespace
  • 视图
  • 中间件
  • orm关系对象映射
    • 操作表
    • 数据库配置
    • model常见字段及参数
    • orm基本操作
  • cookie和session
  • demo
    • 类视图

创建django项目

指定版本安装django:pip install django==3.2

命令行创建django项目:

  1. 先进入到要保存项目的目录中
  2. 然后执行:django-admin startproject 项目名

可以看到创建了这么些文件:

在这里插入图片描述

  • manage.py:项目的管理工具
  • wsgi.py:提供同步的socket服务
  • asgi.py:异步
  • urls.py:主路由
  • settings.py:配置文件,只有一部分,程序启动时会先读取django内部的配置,再读取该文件的配置

内部配置文件路径:

在这里插入图片描述
在这里插入图片描述

编写示例代码:

from django.urls import path
from django.shortcuts import HttpResponse

# 调此函数会带一个request参数,可使用request获取请求数据
def login(request):
    # django的响应是一个封装的对象
    return HttpResponse('登录成功')

urlpatterns = [
    # path("admin/", admin.site.urls),
    path('user/login', login) # 只能写函数名
]

运行:python manage.py runserver
指定端口运行:python manage.py runserver 127.0.0.1:8080

执行运行命令前先进入项目目录
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

应用app

将项目分成不同的功能模块,每个模块对应一个app应用

创建app:进入项目目录执行python manage.py startapp 应用名

在这里插入图片描述

多app的创建:

  1. 在项目目录下创建apps目录,在apps目录下创建以要创的app名为名称创建目录
    在这里插入图片描述
  2. 执行:python manage.py article apps/article
    在这里插入图片描述
  3. 修改该文件内容
    在这里插入图片描述
  4. 注册app
    在这里插入图片描述

调整示例代码结构:

在user应用中的views.py文件编写下列代码:

from django.shortcuts import HttpResponse

def login(request):
    return HttpResponse('login success')

def register(request):
    return HttpResponse('register fail')

修改urls.py文件的路由配置

from django.urls import path
from user import views

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('login/', views.login),
    path('register/', views.register)
]

启动项目,访问
在这里插入图片描述

配置pycharm

配置pycharm启动django项目:

在这里插入图片描述

虚拟环境

使用命令行创建虚拟环境:python官方用于创建虚拟环境的工具:python3.8 -m venv xxx
该命令会基于系统python环境创建出一个虚拟环境,xxx为名称或目录

使用第三方工具:virtualenv,先安装:pip install virtualenv
创建:virtualenv xxx --python=python3.8
激活:

  • win:
    cd venv/Scripts
    activate
  • mac:
    source /venv/bin/activate

退出虚拟环境:deactivate

打包依赖

pip freeze > requirements.txt

在这里插入图片描述
安装依赖:pip install -r requirements.txt

路由

传统路由

路由系统主要是维护url与函数的映射关系

url中包含参数:

path('user/gethead/<int:id>/', views.get_head)

类型:

  • int,整数
  • str,字符串,但不能匹配/
  • slug,字母,数字,下划线,-
  • uuid,uuid的格式
  • path,路径,可包含/
    path('article/del/<int:id>/', delete),
    path('article/del/<str:id>/', delete),
    path('article/del/<uuid:id>/', delete),
    path('article/del/<path:id>/', delete),

直接在函数中添加参数可获取值

def get_head(request, id):
    return HttpResponse(id)

在这里插入图片描述

路由中包含正则,path替换为re_path

def article(request):
    id = request.GET.get('id')
    return HttpResponse(id)

注意:参数id字段要一致
在这里插入图片描述

include路由分发

导包include
主路由:

	from django.urls import path, include
    # 路由匹配到前缀为user,则分发给apps.user中的urls,include中为路径字符串
    path('user/', include('apps.user.urls')),
    path('article/', include('apps.article.urls'))

在user应用中创建urls文件,然后编写路由规则

urlpatterns = [
    path('add/', views.login)
]

在这里插入图片描述

效果:会先找到主路由user/,然后在分发的文件中匹配到add/,完整的路由为user/add/

手动路由分发

    path('user/', ([
        path('del/', views.login),
        path('insert/', views.insert)
                   ], None, None)) # 第一个None为app_name,第二个None为namespace

匹配的url为:user/del/,user/insert/
在这里插入图片描述
include的本质

name = 'zs'

# 相当于导包 from apps.user import urls
module = importlib.import_module("apps.user.urls")
# 也可以使用module.name获取name的值
# 从module中获取name的值,如果获取不到则默认为ls
n = getattr(module, 'name', 'ls')
n = getattr(module, 'name') # 获取不到会直接报错

name

给路由起名字,可以通过名字反向生成url

    path('user/login/', views.login, name='v1'),
    path('user/register/', views.register, name='v2')
def login(request):
    # 在这个视图里,需要重定向到register里,就可以不写url,直接使用name即可
    from django.urls import reverse # 需要导包

    url = reverse('v2')
    return redirect(url) # 重定向,里面是url地址,使用name反推出的url,不用填写真是的url地址

namespace

用来辅助name的,当出现同名的name时,使用name反推出url可能会出现问题,这时候就可以使用namespace来区分不同的name

    path('user/', include('apps.user.urls', namespace='user'))
   path('login/', views.login, name='v1'),
   path('register/', views.register, name='v2')
def login(request):
    # 在这个视图里,需要重定向到register里,就可以不写url,直接使用name即可
    from django.urls import reverse # 需要导包
    
    url = reverse('user:v1') # namespace名:name名
    return redirect(url) # 重定向,里面是url地址,使用name反推出的url,不用填写真是的url地址

使用namespace时,必须提供app_name

from django.urls import path
from apps.user import views

urlpatterns = [
   path('login/', views.login, name='v1'),
   path('register/', views.register, name='v2')
]

app_name = 'user'

如果不提供,会报错
在这里插入图片描述

也可以主动去进行路由分发

    path('user/', ([
        path('login/', views.login, name='v1')
    ], 'user', 'user')) # 第一个user为app_name,第二个user为namespace

路由中尾部的/
路由中带/,但是url不带/访问:127.0.0.1:8000/login

path('login/', views.login)

在这里插入图片描述
会发现其实是进行了两次请求,第一次找不到路经,django自动将/加上再访问一次

这个是由于配置文件中默认APPEND_SLASH=True导致的

如果想严格控制url,可以在settings文件中添加APPEND_SLASH=False

在这里插入图片描述
再进行访问
在这里插入图片描述

在这里插入图片描述

当前url的匹配对象
通过request.resolver_match获取

def login(request):
    cur_obj = request.resolver_match
    print(cur_obj)
    return HttpResponse('login')

在这里插入图片描述
拿到这个有什么用?可以做权限处理

    path('login/', views.login, name='test')
def login(request):
    permissions = ['user', 'article', 'music'] #用户具有的权限,都是name
    cur_obj = request.resolver_match.url_name #获取当前请求的name
    if cur_obj not in permissions:
        return HttpResponse('没有权限')
    print(cur_obj)
    return HttpResponse('login')

在这里插入图片描述

视图

一般功能多的时候,这样创建视图文件
在这里插入图片描述
通过request对象获取请求内容

def login(request):
    print(request.path_info) # 请求url
    print(request.GET.get('username')) # 获取get请求参数
    print(request.GET.get('passowrd'))
    print(request.headers) # 请求头   字典类型
    print(request.COOKIES) # cookie  字典类型
    print(request.method) # 请求方法

    print(request.body) # 原始请求体

    # 获取post请求参数
    # 只针对body格式为a=123&b=abc,且content-type为from表单格式(application/x-www-from-urlencoded)
    print(request.POST.get('username'))
    print(request.POST.get('password'))

    # 获取文件 请求头为multipart/form-data
    request.FILES.get('name1')
    request.FILES.get('name2')

返回数据:

  1. 返回字符串/字节/文本数据
return HttpResponse('xxx')
  1. 返回json数据
def hello(request):
    from django.http import JsonResponse
    ret_dict = {
        'code': 200,
        'data': 'xxx'
    }
    return JsonResponse(ret_dict)
    #return HttpResponse(json.dumps(ret_dict)) 使用json库
  1. 重定向
return redirect('https://www.baidu.com') # 参数为url或者url的name

设置响应头

    ret = HttpResponse('hello world')
    ret['auto'] = 'true'
    ret['name'] = 'zs'
    ret.set_cookie('key', 'value')
    return ret

中间件

MiddlewareMixin
在项目根目录下,创建middlewares目录,在该目录里创建自定义中间件
在这里插入图片描述

from django.utils.deprecation import MiddlewareMixin

class MyMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print('调用视图前')
    def process_response(self, request, response):
        print('调用视图后')
        return response

创建完中间件必须在settings文件中进行注册,中间件是以类定义的
在这里插入图片描述
当在process_request函数中有返回值的时候,那么不会进入视图函数的执行而是接着执行process_response函数

注意:路由匹配是在执行完process_request函数后才匹配到的,也就是process_request函数的request参数为None

process_view

	# view_func是匹配到的路由函数,view_args,view_kwargs是路由的参数
    def process_view(self, request, view_func, view_args, view_kwargs):
        print(request, view_func)

在这里插入图片描述
如果想在前置操作中根据视图函数做一些逻辑可以使用process_view

process_exception

    # 当视图中出现异常时,会捕获到
    def process_exception(self, exception):
        print(exception)

orm关系对象映射

对表的操作(表的创建,修改,删除)
对数据的操作(增删改查)

操作表

在app的models.py文件创建类,一个类就对应一个表结构

  1. 按照规则创建类
from django.db import models
# 生成的表名默认为user_userinfo(app名_类名小写)
class UserInfo(models.Model):
	# 默认会生成一个字增主键id
    name = models.CharField(max_length=10)
    age = models.IntegerField()
    
    class Meta:
	    db_table = 'user'
	    verbose_name = '用户'
	    verbose_name_plural = verbose_name
  1. 注册app(根据注册的app找migrations目录,可以将用不到的app去掉,避免创建使用不到的表)
  2. 执行命令python manage.py makemigrations
    会自动在app目录下的migrations目录下创建一个配置文件
    在这里插入图片描述
  3. 执行命令python manage.py migrate,根据配置文件转换sql语句,链接数据库,执行sql

执行上述命令前,先进行下面的数据库配置

数据库配置

先安装链接mysql的库pymysql/mysqlclient,pip install pymysql
在settings文件中将默认的数据库配置修改下

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog', # 数据库名
        'USER': 'root',
        'PASSWORD': '12345678',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

使用pymysql时,在settings文件的同级目录init文件中添加如下内容

import pymysql
pymysql.install_as_MySQLdb()

在这里插入图片描述

注意:不要手动修改表结构,如果要修改可以修改models文件中的字段,再执行上述的两条命令

数据库连接池
pip install django-db-connection-pool

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog', # 数据库名
        'USER': 'root',
        'PASSWORD': '12345678',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'POOL_OPTIONS': {
            'POOL_SIZE': 10, # 最小连接数
            'MAX_OVERFLOW': 10, # 额外增加的连接数
            'RECYCLE': 24 * 60 * 60, # 每个连接最长可以使用多久
            'TIMEOUT': 30,  # 无连接时,最长等待时间
        }
    }
}

model常见字段及参数

class UserInfo(models.Model):
    # CharField为字符串,max_length为字符串的最大长度,verbose_name字段含义,默认null=False不许为空
    # 一般null和blank结合使用,null指数据库是否为可为空,blank为页面是否可为空
    name = models.CharField(verbose_name='姓名', max_length=10, default='无名氏', null=True, blank=True)
    # db_index表示添加索引,unique唯一约束
    age = models.IntegerField(verbose_name='年龄', db_index=True, unique=True)
    rage = models.BigIntegerField(verbose_name='长整型年龄')
    content = models.TextField(verbose_name='详情')

    # auto_now,当插入数据不传该字段时会使用当前时间
    create_data = models.DateField(verbose_name='日期', auto_now=True) # 日期:年月日
    rcreate_data = models.DateTimeField(verbose_name='时间') # 时间:年月日时分秒
    active = models.BooleanField(verbose_name='是否')
    # max_digits总共位数,decimal_places小数点后几位
    salary = models.DecimalField(verbose_name='余额', max_digits=10, decimal_places=2)

表关系

一对多:

class UserInfo(models.Model):
    '''用户表'''
    name = models.CharField(max_length=5, verbose_name='员工姓名')
    age = models.IntegerField(verbose_name='年龄')
    # ForeignKey外键,to表示与哪张表关联,to_field表示与哪个字段关联
    # on_delete=models.CASCADE表示级联删除,models.SET_NULL表示设置为null
    # models.SET_DEFAULT表示设置默认值
    # 数据库生成的字段会默认给depart加上_id,depart_id
    depart = models.ForeignKey(verbose_name='部门id',default=1, null=True, blank=True, to='Depart', to_field='id', on_delete=models.SET_DEFAULT)
class Depart(models.Model):
    '''部门表'''
    name = models.CharField(verbose_name='部门名称')

多对多:

class UserInfo(models.Model):
    name = models.CharField(max_length=5, verbose_name='姓名')
class MusicInfo(models.Model):
    title = models.CharField(max_length=20, verbose_name='音乐标题')
class UAndM(models.Model):
    nid = models.ForeignKey(to=UserInfo, to_field='id', verbose_name='用户id')
    tid = models.ForeignKey(to=MusicInfo, to_field='id', verbose_name='音乐id')

orm基本操作

单表操作
增:

def register(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    dict = {
        'username': username,
        'password': password
    }
    # 方式1
    # 返回值是以UserInfo这个类创建的对象
    # user = models.UserInfo.objects.create(username=username, password=password)
    user = models.UserInfo.objects.create(**dict) # 匹配的参数类型是**kwargs,使用字段传参时,要带上**
    print(user.username)
    print(user.password)
    # 批量插入
    models.User.objects.bulk_create(
        objs=[models.User(name='zs', age=10),models.User(name='ls', age=12)],
        batch_size=2 # 一次提交几条
    )
    # 方式2
    user1 = models.UserInfo(username='zs', password='123')
    user1.save()
    return HttpResponse(user)

删:

 # 删除
    # 返回值是受影响的行数
    n1 = models.UserInfo.objects.all().delete()
    n2 = models.UserInfo.objects.filter(username='zs').delete()

更新:

# 更新
    # 返回值是受影响的行数
    n3 = models.UserInfo.objects.all().update(password='123')
    n4 = models.UserInfo.objects.filter(username='zs').update(password='123')

查询:

    # 查
    list = models.UserInfo.objects.all() # 返回类型是queryset(类似列表),里面存放一个个对象
    # list.query 可以获取sql语句
    for obj in list:
        print(obj.username)
    list2 = models.UserInfo.objects.filter(username='zs') # 返回类型也是queryset
    list3 = models.UserInfo.objects.filter(age__gt=10) # age>10
    # age__gte=10 age>=10
    # age__lt=10   age<10
    # age__lte=10  age<=10
    # age__in=[10,20,30]  age in (10,20,30)
    # username__contains='张'  包含 '张' %张%
    # username__startswith='张' 以 ‘张’ 开头  张%
    list4 = models.UserInfo.objects.filter(username='zs', password='123')  # and
    list5 = models.UserInfo.objects.exclude(username='zs') # username!='zs'
    # 如果查不到数据,返回依旧是queryset,不过里面没对象[]
	models.UserInfo.objects.filter(username='zs') # queryset[obj,obj]
    models.UserInfo.objects.filter(username='zs').values('username', 'passowrd') # queryset[{},{}]
    models.UserInfo.objects.filter(username='zs').values_list('username', 'passowrd') # queryset[(),()]

    user = models.UserInfo.objects.filter(username='zs').first() # 返回值为对象
    flag = models.UserInfo.objects.filter(username='zs').exists() # 返回值为true false 是否存在

    users1 = models.UserInfo.objects.all().order_by('id') # 排序 asc
    users2 = models.UserInfo.objects.all().order_by('-id') # 排序 desc
    # order_by('-id', 'age') id desc age asc

一对多

def login(request):
    # 一对多查询
    # depart = models.ForeignKey(to='Depart', to_field='id', on_delete=models.CASCADE)
    # 查用户及部门  使用 __
    v = models.User.objects.filter(id=1).first()
    print(type(v.depart)) # 类型为class(为Depart的一个实例对象)  可以使用depart.title获取字段
    v3 = models.User.objects.filter(id__gt=0).select_related('depart')
    for i in v3:
        print(i.name, i.age, i.depart.title)

    v1 = models.User.objects.filter(id=1).values('name','age','depart__title') # [{},{}]
    v2 = models.User.objects.filter(id=2).values_list('name','age','depart__title') # [(),()]
   
    return HttpResponse('hh')

cookie和session

def login(request):
    res = HttpResponse('hello')
    # path是为了设置那个请求访问时携带上cookie /login   domain为了限制域名
    # 响应头中有setCookie: zs:123,超时时间10s
    # secure=True 只有https请求时才携带cookie
    # httponly=True只允许在http中访问
    res.set_cookie('zs', '123', max_age=10, path='/', domain='baidu.com', secure=False, httponly=False)
    # 默认值 浏览器重新打开 / 当前域名  False False
    return res

def home(request):
    cookies = request.COOKIES # 获取所有的cookie
    print(cookies)
    cookie1 = cookies.get('zs') # 根据键获取值
    return HttpResponse(cookie1)

session配置

# session配置
# 存缓存
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 保存会话引擎,缓存.cache,文件.file,数据库.db
SESSION_CACHE_ALIAS = 'default' # 使用哪个缓存保存,默认使用default,可通过CACHES配置
# 存文件
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = 'xxx' # 文件路径
# 存数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 必须将app session的注释打开

SESSION_COOKIE_AGE = 1209600 # 两周超时时间
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 关闭 关闭浏览器cookie过期
SESSION_COOKIE_DOMAIN = None # 域名
SESSION_COOKIE_PATH = '/' #路径
SESSION_SAVE_EVERY_REQUEST = True # 设置每次请求都保存session
SESSION_COOKIE_SECURE = False # 是否https传输cookie
SESSION_COOKIE_HTTPONLY = True # cookie只支持http传输

CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.locmem.LocMemCache",
    },
    'redis': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        },
    },
}

注册app(保存在数据库中需要将注释打开)与添加中间件,django项目默认自带

在这里插入图片描述

def login(request):
    request.session['user'] = 'abc' # 设置session
    session = request.session.get('user') # 获取session

demo

实现登录效果

def login(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    user = models.User.objects.filter(username=username,password=password).first()
    if user != None:
        request.session['user'] = user
        return JsonResponse({'msg': 'login success'})
    else:
        return JsonResponse({'msg': 'login fail'})
def home(request):
    user = request.session.get('user')
    if user != None:
        return HttpResponse('success')
    else :
        return HttpResponse('fail')
<script>
    $("#but").click(function(){
        let username = $("#username");
        let password = $("#password");
        $.ajax({
            url: "/login", //请求后端路径
            type: "post", //请求类型
            data: {"username": username.val(), "password": password.val()}, //请求数据(json类型)
            success: function(body){ //回调函数
                //console.log(typeof body)
                alert(body.msg)
            }
        });
    })
</script>

settings文件添加该配置

STATIC_URL = '/static/' # 浏览器可直接访问静态文件
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # 存放静态文件的公共文件夹

类视图

from django.http import JsonResponse
from django.views import View
from . import models
import json

class UserView(View):
    def get(self, request):
        # queryset不能参与序列化,转为列表
        users = list(models.User.objects.values()) # [{},{}]
        # users = models.User.objects.first() vars(users)可将对象转为字典
        return JsonResponse(data=users,safe=False) # safe默认为true只能序列化字典,设置为true可序列化列表,元组...
    def post(self, request):
        data = json.loads(request.body)
        username = data.get('username')
        password = data.get('password')
        user = models.User.objects.create(username=username,password=password)
        return JsonResponse(data={'id':user.id,'username':username,'password':password})
from django.urls import path
from .views import UserView
urlpatterns = [
    path('user/', UserView.as_view())
]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【linux】04 :linix实用操作

1.常用快捷键 ctrlc表示强制停止。linux某些程序的运行&#xff0c;如果想强制停止&#xff0c;可以使用&#xff1b;命令输入错误&#xff0c;也可以通过ctrlc,退出当前输入&#xff0c;重新输入。 ctrld表示退出登录&#xff0c;比如退出root以回到普通用户&#xff0c;或者…

C++ Qt开发:QHostInfo主机地址查询组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QHostInfo组件实现对主机地址查询功能…

spring-cloud-openfeign 3.0.0(对应spring boot 2.4.x之前版本)之前版本feign整合ribbon请求流程

在之前写的文章配置基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 下图为自己整理的

UE5 UE4 开发常用工具AssetDeveTool

AssetDeveTool工具&#xff0c;支持UE5 5.0-.5.3 UE4 4.26/4.27 下载链接&#xff1a; 面包多 https://mbd.pub/o/bread/ZZubkphu 工坊&#xff1a; https://gf.bilibili.com/item/detail/1104960041 包含功能&#xff1a; 自动化批量展UV功能 快速选择功能 自动化批量减面功能…

SoraAI视频工具优先体验资格申请步骤

SoraAI视频工具优先体验资格申请 申请网址&#xff1a;OpenAI Red Teaming Network application 申请步骤&#xff1a; 填写基础信息 请使用英文根据内容填写以下内容&#xff0c;名、姓、电子邮件、居住国家、组织隶属关系(如果有)、教育水平 、学位&#xff08;哪个领域的…

02-gitlab的数据备份和恢复

一、gitlab的数据备份 关于数据备份&#xff0c;咱们就不需要多说什么了&#xff0c;主要就是方式数据意外丢失&#xff0c;导致代码上线流程及数据的损坏崩溃&#xff1b; 为了避免严重生产事故&#xff0c;进而gitlab有了数据备份与恢复的功能。 1&#xff0c;修改gitlab的配…

python淘宝网页爬虫数据保存到 csv和mysql(selenium)

数据库连接设置&#xff08;表和字段要提前在数据库中建好&#xff09; # 数据库中要插入的表 MYSQL_TABLE goods# MySQL 数据库连接配置,根据自己的本地数据库修改 db_config {host: localhost,port: 3306,user: root,password: ma*****6,database: may2024,charset: utf8mb…

MySQL 篇-快速了解事务、索引

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 事务概述 1.1 事务四大特性(ACID) 2.0 索引概述 2.1 关于 “索引一定要创建在主键上&#xff1f;” 的问题 2.2 索引操作语法 2.3 索引结构 1.0 事务概述 事务是…

【生态适配】亚信安慧AntDB数据库与OpenCloudOS、TencentOS Server五款产品完成兼容互认

日前&#xff0c;亚信安慧AntDB数据库与OpenCloudOS8、OpenCloudOS9、TencentOS Server 2、TencentOS Server 3、TencentOS Server 4五款操作系统完成兼容互认。经过严格测试&#xff0c;亚信安慧AntDB数据库与这五款操作系统兼容良好&#xff0c;整体运行稳定。 图1&#xff1…

stm32普通定时器脉冲计数(发送固定脉冲个数),控制步进电机驱动器

拨码开关设置驱动器&#xff0c;细分 方法思路&#xff1a;用通用定时器TIM2&#xff0c;1ms产生一次中断&#xff1b;在中断里做IO反转&#xff1b; 发送10个脉冲信号

签约仪式如何策划和安排流程?如何邀约媒体现场见证报道

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 签约仪式的策划和安排流程&#xff0c;以及邀约媒体现场见证报道&#xff0c;都是确保活动成功和提升影响力的关键环节。以下是一些建议&#xff1a; 签约仪式的策划和安排流程 明确目标…

patreon订阅

订阅制度&#xff1a; 创作者可以创建一个Patreon页面&#xff0c;邀请粉丝成为其“赞助者”或“粉丝”。这些粉丝可以选择每月或每个创作周期为创作者提供一定数额的资金支持&#xff0c;形成了一种订阅模式。 奖励层次&#xff1a; 创作者通常会设置不同的奖励层次&#xff…

MySQL安装使用(mac)

目录 一、下载MySQL 二、环境变量 三、启动 MySql 四、初始化密码设置 一、下载MySQL 打开 MySql 官方下载页面 我是macOS12&#xff0c;所以选择了8.0.30 下载完成之后&#xff0c;打开安装&#xff0c;一直下一步安装完成&#xff0c;在最后安装完成时&#xff0c;会弹出…

一周学会Django5 Python Web开发-Django5内置模板引擎-模板上下文变量

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计32条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

Linux系统Docker部署DbGate并结合内网穿透实现公网管理本地数据库

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-66GkyG9g7oNq7tl8 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

Windows®、Linux® 和 UNIX® 系统都适用的远程桌面工具 OpenText ETX

Windows、Linux 和 UNIX 系统都适用的远程桌面工具 OpenText ETX 为 Windows、Linux 和 UNIX 实施精益、经济高效的虚拟化&#xff1b;提供完整的远程 Windows 可用性&#xff1b;以类似本地的性能远程工作&#xff1b;安全地保护系统和知识产权&#xff08;IP&#xff09;&am…

k8s-生产级的k8s高可用(1) 24

高可用集群 实验至少需要三个master&#xff08;控制节点&#xff09;&#xff0c;一个可以使外部可以访问到master的load balancer&#xff08;负载均衡&#xff09;以及一个或多个外部节点worker&#xff08;也要部署高可用&#xff09;。 再克隆三台主机 清理并重启 配置两…

YOLOv7原创改进:原创自研 | CVPR2024 DCNv4结合YOLOv9 SPPELAN二次创新 | 涨点小能手

💡💡💡本文独家改进: CVPR2024 DCNv4结合YOLOv9 SPPELAN二次创新,结构图如下: 改进结构图: 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现涨点 收录 YOLOv7原创自研 https://blog.csdn.net/m0_63774211/category_12511937.html 💡�…

银河麒麟服务器ky10 server wvp镜像制作

在线安装docker yum install docker -y cat >/etc/docker/daemon.json<<EOF{"registry-mirrors": ["https://registry.docker-cn.com","https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com"]} EOF systemctl start …

java注释的详尽解析

一、什么是注解 (1).注解的作用 ①&#xff1a;注解一般用于对程序的说明&#xff0c;就像注释一样&#xff0c;但是区别是注释是给人看的&#xff0c;但是注解是给程序看的。 ②&#xff1a;让编译器进行编译检查的作用&#xff0c;比如下边这个Override注解是重写的意思&am…
最新文章