django中操作mysql資料庫

来源:https://www.cnblogs.com/suncolor/archive/2022/09/03/16642835.html
-Advertisement-
Play Games

1.準備工作(django連接資料庫) 1.本機電腦下載好mysql資料庫 2.打開django,修改setting.py中的DATABASES配置項 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': ' ...


1.準備工作(django連接資料庫)

1.本機電腦下載好mysql資料庫
2.打開django,修改setting.py中的DATABASES配置項

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'python',
        'USER': 'root',
        'PASSWORD': 'zy199909237412',
        'HOST': '127.0.0.1',
        'POST': '3306',
    }
}

3.在pycharm的右側欄點擊database或者做下角點擊database,連接資料庫,如果都沒有,則去pluging裡面尋找是否裝了database插件!!
image
或者
image

4.輸入需要連接的資料庫
image

5.這裡沒有下載驅動的需要先下載,不然連接不上

image

6.在django項目中的__init__.py中導入pymysql,告訴django使用pymysql連接資料庫,而不是mysqldb模塊

import pymysql
pymysql.install_as_MySQLdb()

7.簡單使用pycharm操作資料庫
image

2.django操作資料庫(ORM)

2.1 ORM簡介

對象關係映射(Object Relational Mapping,簡稱ORM)模式是一種為瞭解決面向對象與關係資料庫存在的互不匹配的現象的技術。ORM在業務邏輯層和資料庫層之間充當了橋梁的作用

簡單來說,ORM就是使用面向對象的方式來操作資料庫!

(1)ORM的優勢:

1.將表和類一一對應,類的每個實例對應表中的一條記錄,類的每個屬性對應表中的每個欄位。
2.ORM提供了對資料庫的映射,不用直接編寫SQL代碼,只需操作對象就能對資料庫操作數據,提高了工作效率

(2)ORM的劣勢

1.一些查詢操作完成不了
2.一定程度上犧牲了程式的執行效率
3.用久了會忘SQL語言

2.2 創建表和欄位

from django.db import models # 1.導入models模塊

# 2.定義一個類繼承models.Model類(創建一張項目名(應用名)_類名的表)
class Book(models.Model):

# 3.定義類屬性title和price(對應是創建欄位名、欄位類型和欄位選項)
title = models.CharField('書名', max_length=50, default='')
price = models.DecimalField('價格', max_digits=7, decimal_places=2)

class 模型類名(models.Model):
           欄位名 = models.欄位類型(欄位選項)


在類裡面不指定主鍵欄位,django會幫您自動創建一個id主鍵!

註意:對於資料庫的增刪改查之後都要進行資料庫遷移
1.執行python3 manage.py makemigration---將應用下的model.py文件生成一個中間件文件,並保存在migrations文件中
2.執行python3 manage.py migrate ----將每個應用下的migrations目錄中的中間文件同步回資料庫

2.3 欄位的增刪改查

1.增加欄位

直接在對應的類裡面添加欄位、欄位類型和欄位選項

註意增加的欄位都需要指定default = '' 或者null = True,如下添加info欄位:

info = models.CharField(max_length=32,default='',null=True)

2.修改欄位

直接在類裡面修改對應欄位就行!
然後執行資料庫遷移命令!

3.欄位的刪除

直接在類裡面將需要刪的欄位註釋掉就行!
然後執行資料庫遷移命令!

註意:執行完畢了,資料庫對應的數據就沒有了!慎重!!!

2.4 單表數據的增刪改查

每個繼承model.Model的模型類,都有一個objects對象被同樣繼承下來,這個對象叫管理器對象,資料庫的增刪改查都是通過模型的管理器實現。

對於數據的增刪改查,其實最主要的都是在views.py的視圖函數里完成的!因此,我們需要在視圖函數里進行資料庫的增刪改查操作!

2.4.1單表數據的查詢

1.filter()查詢方法

from app01 import models  # 1.導入自己創建的模型類

# 2.filter查詢方法,語法是:models.類名.objects.filter(),filter內可以查詢多個參數,預設是and連接,等於SQL語法的where方法!,不傳參時代表查所有

res = models.MyModle.objects.filter(username=username)
# 該方法有一個返回值,返回的是一個queryset對象,該對象可以看成是列表套字典的形式,列表裡面套著一個個數據對象,形式為:[數據對象1,數據對象2]
# queryset列表也支持索引,切片操作,但是不支持負數索引,可以當成列表套字典的形式for迴圈

user_obj = res[0]  # 得到的是具體的數據對象,但是官方不推薦使用索引的方式取到具體的數據對象,它推薦的是res.first()方法取到列表裡的第一個數據對象!

print(user_obj.username)  # 通過點大法,即.屬性的方法得到具體的值

2.all()查詢所有方法

# all方法查詢User表的所有數據,返回的是一個queryset對象列表,
user_queryset = models.User.objects.all()

2.4.2單表數據的增加

1.create()方法

# create增加數據方法,語法是:models.類名.objects.create()
res = models.MyModle.objects.create(username=username,password=password)
# 該方法也有一個返回值,返回的是當前這個數據對象
print(res.username,res.password) # 可以通過點屬性的方法,查看到對應屬性的值

2.save()方法

obj = models.User(username=username,password=password)
obj.save() # 保存數據到資料庫

2.4.3單表數據的修改

1.upadte()方法:先查出來,在更新

# 查出id為什麼的對象,然後進行批量更新。filter可以查所有,也可以查具體
models.User.objects.filter(id=edit_id).update(username=username,password=password)

2.賦值+save()方法

obj = models.User.objects.filter(id=edit_id).first() #拿到待修改的對象
obj.username = username # 採用給該對象屬性重新賦值的方法修改數據
obj.password = password
obj.save() # 最後賦值完記得需咬保存

2.4.4單表數據刪除

1.delete()方法:用於批量刪除

# 先filter查出需要刪除的對象,然後.delete()方法
models.User.objects.filter(id=delete_id).delete() # 這裡是把filter查出來的queryset對象里全部刪除了,有幾個刪幾個。
# 這裡的id可以改寫成pk,用了pk就不需要知道表的主鍵是id還是其他什麼了!

2.單一刪除

res = models.User.objects.filter(id=delete_id).first()
res.delete()  # 單一刪除

2.4.5補充13條單表查詢

# 1.all()  查詢所有數據

# 2.filter()     帶有過濾條件的查詢,拿到的是一個queryset對象列表

# 3.get()        直接拿數據對象 但是條件不存在直接報錯

# 4.first()      拿queryset裡面第一個元素
# res = models.User.objects.all().first()
# print(res) # 拿到queryset對象列表裡的第一個數據對象

# 5.last()
# res = models.User.objects.all().last()
# print(res) # 同上,拿到的是最好一個

# 6.values()  可以指定獲取的數據欄位  select name,age from ...
# res = models.User.objects.values('name','age')
# print(res)  # 結果為:列表套字典<QuerySet [{'name': 'jason', 'age': 18}, {'name': 'egonPPP', 'age': 84}]>

# 7.values_list()
# res = models.User.objects.values_list('name','age')
# print(res) # 結果為:列表套元祖,<QuerySet [('jason', 18), ('egonPPP', 84)]>

# 8.query
#  print(res.query)  # 查看內部封裝的sql語句
#  上述查看sql語句的方式  只能用於queryset對象
#  只有queryset對象才能夠點擊query查看內部的sql語句

# 9.distinct()  去重
# res = models.User.objects.values('name','age').distinct()
# print(res)
"""
去重一定要是一模一樣的數據
如果帶有主鍵那麼肯定不一樣 你在往後的查詢中一定不要忽略主鍵
"""

# 10.order_by()
# res = models.User.objects.order_by('age')  # 預設升序
# res = models.User.objects.order_by('-age')  # 降序
# print(res)

# 10.reverse()  反轉的前提是 數據已經排過序了  order_by()
# res = models.User.objects.all()
# res1 = models.User.objects.order_by('age').reverse()
# print(res,res1)

# 11.count()  統計當前數據的個數
# res = models.User.objects.count()
# print(res)

# 12.exclude()  排除在外
# res = models.User.objects.exclude(name='jason')
# print(res)

# 13.exists()  #基本用不到因為數據本身就自帶布爾值  返回的是布爾值
# res = models.User.objects.filter(pk=10).exists() # 判讀主鍵為10的是否存在,返回是布爾值
# print(res)

2.4.6 神奇的雙下劃線查詢

__exact:等值查詢 
__contains:包含指定值--區分大小寫   a2=Book.objects.filter(name____contains=‘n’) 查詢出名字里包含n的
__icontains:包含指定值--忽略大小寫
__startwith:以xxx開始
__endwith:以xxx結尾
__gt:大於指定值,例如:a2=Book.objects.filter(id__gt=3)
__gte:大於等於
__it:小於
__ite:小於等於
__in:查找數據是否在指定範圍內 a2=Book.objects.filter(id__in=[1,3,5])
__range:查詢數據是否在指定區間範圍內 a2=Book.objects.filter(id__range=[1,5]) 查詢出id在1-5的收尾都要
a2=Book.objects.filter(register_time__month='1'):查詢出月份是1月的數據
a2=Book.objects.filter(register_time__year='2022'):查詢出年份在2022的數據

2.5 多表數據操作

2.5.1 orm創建表關係

表的關係有三種,分別是:一對一、一對多、多對多

判斷表和表之間的關係:換位思考法

具體創建表關係語法:

"""
圖書和出版社:一對多關係,外鍵建在多的一方
圖書和作者:多對多關係,外鍵建在任何一方,但是推薦建在查詢頻率高的一方
作者和作者詳情:一對一關係,外鍵建在任何一方,但是推薦建在查詢頻率高的一方
"""
class Book(models.Model):
    title = models.CharField(verbose_name='書名',max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    create_time = models.DateTimeField(auto_now_add=True)
    # 一對多外鍵建在多的一方,to='是需要建立外鍵的那一個類名publish'
    # 註意:在django2、3裡面需要指定級聯刪除參數on_delete=models.CASCADE
    publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
    # 多對多外鍵建在查詢頻率高的一方,多對多在sql語句中需要自己手動建第三張表,但是在django中,django遇到會自動幫你創建第三張表!
    author = models.ManyToManyField(to='Author')

class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)
    email = models.EmailField()

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    # 一對一外鍵建在查詢頻率高的一方,需要指定on_delete
    author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)

class AuthorDetail(models.Model):
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=64)

2.5.2 一對多關係的增刪改

from app01 import models
# 1.增
# 法1:直接寫book表裡面的外鍵的實際欄位名,然後指定關聯publish的id就行
models.Book.objects.create(title='活著',price=33,publish_id=1)
# 法2:虛擬欄位,傳入一個具體的publish的數據對象就行
publish_obj = models.Publish.objects.filter(pk=2).first()
# 註意這裡需要.first()一下,因為不點拿到的是queryset對象,點一下拿到queryset里的具體數據對象
models.Book.objects.create(title='我',price=555,publish=publish_obj)

# 2.刪
models.Publish.objects.filter(pk=2).delete() # 將book里關聯id=2的也全部刪除

# 3.改
# 法1:update裡面傳具體需要修改的外鍵欄位名和值
models.Book.objects.filter(pk=2).update(publish_id=2) # 將id為2的書的關聯publish_id改成2
# 法2:update裡面傳入虛擬欄位publish=需要關聯的publish數據對象,同增的法2

2.5.3 多對多關係的增刪改

# 1.增
# 一本書對應多個作者,先查出這個書的對象,在通過對象.多對多欄位名.add()方法關聯作者id
# add()方法裡面可以法數字1,2,3,表示關聯作者的主鍵值;還可以放具體的作者數據對象!!
book_obj = models.Book.objects.filter(pk=1).first()
book_obj.author.add(1,2)
author_obj = models.Author.objects.filter(pk=1).first()
book_obj.author.add(author_obj)

# 2.刪
# 刪除這邊書關聯的作者id為1和2的,和add方法一樣也支持裡面放具體的作者數據對象!!
book_obj.author.remove(1,2)

# 3.改
# set方法修改該書關聯的作者id為1和3,set方法和add方法一樣也支持裡面放具體的作者數據對象!!
# 註意:set方法裡面必須放一個可迭代對象,比如列表!
book_obj.author.set([1,3])

# 4.清空當前書和作者的對應關係
book_obj.author.clear()

2.5.4 多表的查詢操作

查詢的時候,分正方向查詢,外鍵欄位在我手上,我查你就是正向查詢;反之,不在我手上,我查你就是反向查詢。

查詢口訣:正向查詢按欄位,反向查詢按表名小寫;

1.基於對象的多表查詢

 from app01 import models

    # 1.查詢書籍主鍵為1的出版社名稱 ----正向一對多查詢
    book_obj = models.Book.objects.filter(pk=1).first() # 先得到主鍵為1的書籍對象
    res = book_obj.publish # 正向查詢按欄位,Book表裡面有一個publish欄位,返回一個與主鍵1關聯的出版社對象
    print(res)
    print(res.name) # 對象.的方法查詢具體的欄位屬性
    print(res.addr)

    # 2.查詢書籍主鍵為1的作者----正向多對多查詢
    book_obj1 = models.Book.objects.filter(pk=1).first()
    res = book_obj1.author.all() # 不.all()返回的是一個app01.Author.None
    print(res) # .all()返回的是<QuerySet [<Author: Author object (1)>, <Author: Author object (2)>]>,書籍id為1對應兩個作者
    print(res.first().name) # 通過.first().name 方式獲取作者的具體信息

    # 3.查詢作者王的電話 ----正向一對一查詢
    author_obj = models.Author.objects.filter(name='王').first()
    res = author_obj.author_detail
    print(res) # 返回的是AuthorDetail object (1),是一個作者詳情對象
    print(res.phone) # .欄位查出對應作者的詳情信息
    """
    總結:正向查詢時,當你的結果可能是多個的時候,就需要加.all(),如果是一個直接拿到數據對象
    """

    # 4.查詢出版社是東風出版社的書----反向一對多查詢
    publish_obj = models.Publish.objects.filter(name='東風').first()
    res = publish_obj.book_set.all()
    print(res)

    # 5.查詢作者是王寫過的書----反向多對多查詢
    author_obj = models.Author.objects.filter(name='王').first()
    res = author_obj.book_set.all()
    print(res)

    # 6.查詢電話號碼是122324233的作者
    author_detail_obj = models.AuthorDetail.objects.filter(phone=122324233).first()
    res = author_detail_obj.author
    print(res.name)
    """
    總結:反向查詢的時候,如果結果為多個,就需要加_set.all();如果是一對一結果就一個,就不用!
    """

2.基於雙下劃線__的多表查詢


    from app01 import models

    # 1.查詢王這個作者的年齡和手機號--正向一對一查詢
    # 先得到王這個對象,然後.values,裡面放需要查詢的欄位名,正向則直接'欄位名';反向則'表名小寫__欄位名'
    res = models.Author.objects.filter(name='王').values('age','author_detail__phone')
    print(res) # 得到的是一個queryset對象(列表裡套了一個字典)
    dict = res.first()  # .first()方法取到該字典對象
    print(dict['age']) # 字典方式取到具體需要的值
    # 反向查詢
    res = models.AuthorDetail.objects.filter(author__name='王').values('phone','author__age')
    print(res)

    # 2.查詢書籍主鍵為1的出版社名字和書的價格---正向一對多查詢
    res = models.Book.objects.filter(pk=1).values('price','publish__name')
    print(res)
    # 反向查詢
    res = models.Publish.objects.filter(book__id=1).values('name','book__price')
    print(res)

    # 3.查詢書籍主鍵為1的作者姓名和書籍名稱
    res = models.Book.objects.filter(pk=1).values('title','author__name')
    print(res)
    # 反向查詢
    res = models.Author.objects.filter(book__id=1).values('name','book__title')
    print(res)
	
    # 4.終極大招:查詢書籍主鍵為1的作者的電話號碼!!!---跨了book、author、author_detail三張表查詢
    res =models.Book.objects.filter(pk=1).values('author__author_detail__phone')
    print(res)
    # 反向查詢
    res = models.Author.objects.filter(book__id=1).values('author_detail__phone')
    print(res)

2.6 欄位類型與欄位選項

from django.db import models

# Create your models here.
class MyBook(models.Model):
    # 1.字元串欄位類型CharField,必須傳的欄位選項是max_length=指定最大字元數,verbose_name=''指定該欄位在django後臺管理中的描述名
    name = models.CharField(max_length=32,verbose_name='姓名')
	
    # 2.數字欄位類型IntegerField
    age = models.IntegerField()
	
    # 3.日期時間欄位類型DateTimeField
    register_time = models.DateTimeField(auto_now_add=True)
	
    # 4.日期欄位類型
    register_time = models.DateField(auto_now_add=True)
	
    # 針對這兩個欄位類型,有兩個關鍵性參數
    # auto_now:每次操作數據的時候,該欄位會自動將當前時間更新
    # auto_now_add:在創建數據的時候會自動將當前時間記錄下來,以後只要不認為修改就一直不變
	
    # 5.郵箱欄位
    email = models.EmailField()
	
    # 6.大數字欄位類型
    phone = models.BigIntegerField()
	
    # 7.小數欄位,有兩個欄位選項max_digits=8,表示連小數一共8位;decimal_places=2,表示小數部分2位。
    price = models.DecimalField(max_digits=8,decimal_places=2)
	
    # 8.布爾型欄位,傳入參數是False\True,在資料庫中對應0\1
    boolean = models.BooleanField(False)
	
    # 9.文本欄位類型,沒有字數限制,大文本
    text = models.TextField()
	
    # 10.文件欄位類型,upload_to=''參數:給該欄位傳一個文件對象,會自動將該文件保存在/data目錄下,如何把該文件的路徑傳到資料庫中
    file = models.FileField(upload_to='/data')
	
    自定義欄位暫略

2.7聚合查詢

聚合函數通常是和分組一起使用的,關鍵字.aggregate()方法

    # 先導入五個聚合函數
    """
    小技巧:只要跟資料庫相關的模塊,基本上都在django.db.models裡面
    如果沒有則可能在django.db裡面
    """
    from django.db.models import Sum,Avg,Min,Max,Count
    # 1.求書這個表裡面的價格平均值和總合和最大值...單獨使用需要使用.aggregate方法
    res = models.Book.objects.aggregate(Avg('price'),Max('price'),Sum('price'))
    print(res)

2.8分組查詢

分組查詢關鍵字annotate

# 1.統計每本書的作者個數
    res = models.Book.objects.annotate(author_num=Count('author')).values('author_num')
    print(res)
    """
    說明:
    1.分組查詢的關鍵字是annotate
    2.models後面點什麼,就是按什麼分的組
    3.author_num是自己自定義的欄位,用來存統計出來的每本書對應的個數
    4.count裡面的author指的是統計作者的個數
    5.values('author_num')是取出統計出來的作者個數
    """

    # 2.統計每個出版社賣的最便宜書的價格
    res = models.Publish.objects.annotate(book_price=Min('book__price')).values('name','book_price')
    print(res)
    print('=========')
    # 3.統計作者個數不止一個的圖書
    # 先按圖書分組,求出圖書對應的作者個數;再filter過濾出作者個數大於1的
    res = models.Book.objects.annotate(author_num=Count('author')).filter(author_num__gt=1).values('title','author_num')
    print(res)

    # 4.查詢每個作者出的書的總價格
    res = models.Author.objects.annotate(book_price=Sum('book__price')).values('name','book_price')
    print(res)

    """
    那麼如何按照欄位分組呢?
    models.Book.objects.values('price').annotate()  
    # 如果annotate前面出現了values,則它將不在按照book分組,而是按照values分組
    """

2.9F與Q查詢

2.9.1F查詢

# F查詢
    # 1.查詢賣出數大於庫存數的書籍
    # F查詢
    """
    能夠幫助你直接獲取到表中某個欄位對應的數據
    """
    from django.db.models import F # 導入f模塊
    # res = models.Book.objects.filter(maichu__gt=F('kucun')) #f括弧里放的是對應的欄位名
    # print(res)


    # 2.將所有書籍的價格提升500塊
    # models.Book.objects.update(price=F('price') + 500)


    # 3.將所有書的名稱後面加上爆款兩個字
    """
    在操作字元類型的數據的時候 F不能夠直接做到字元串的拼接
    """
    from django.db.models.functions import Concat
    from django.db.models import Value  # 先導入Concat和Value模塊
    models.Book.objects.update(title=Concat(F('title'), Value('爆款')))
    # models.Book.objects.update(title=F('title') + '爆款')  # 所有的名稱會全部變成空白

2.9.2Q查詢

# Q查詢
    # 1.查詢賣出數大於100或者價格小於600的書籍
    # res = models.Book.objects.filter(maichu__gt=100,price__lt=600)
    """filter括弧內多個參數是and關係,並不能得到結果"""
    from django.db.models import Q # 導入q模塊,實現或和not功能
    # res = models.Book.objects.filter(Q(maichu__gt=100),Q(price__lt=600))  # Q包裹逗號分割 還是and關係
    # res = models.Book.objects.filter(Q(maichu__gt=100)|Q(price__lt=600))  # | or關係
    # res = models.Book.objects.filter(~Q(maichu__gt=100)|Q(price__lt=600))  # ~ not關係
    # print(res)  # <QuerySet []>

    # Q的高階用法  能夠將查詢條件的左邊也變成字元串的形式
    q = Q()
    q.connector = 'or'
    q.children.append(('maichu__gt',100))
    q.children.append(('price__lt',600))
    res = models.Book.objects.filter(q)  # 預設還是and關係
    print(res)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 線程基礎01 1.程式 進程 線程 程式(program):是為完成的特定任務,用某種語言編寫的一組指令的集合。簡單來說,就是我們寫的代碼。 進程: 進程是指運行中的程式,比如我們使用QQ,就啟動了一個進程,操作系統就會為該進程分配空間。當我們使用迅雷,又啟動了一個進程,操作系統將為迅雷分配新的記憶體 ...
  • 1、請求處理參數 1.1 請求參數 @RequestParam 1.1.1 不使用 @RequestParam 註解 請求參數處理,不使用參數註解: 1.如果請求參數名和請求處理的形參名一致,springMvc 框架會自動將你的請求參數名對應的參數值,綁定到請求方法的形參中,方法內就可以直接使用,不 ...
  • 在大多情況下,我們都是用new去實例化對象。但是,有時候有的對象的類別有很多種,又存在著共性,就好比如汽車,有賓士,紅旗,寶馬等品牌,如果是一個一個去創建類,那就需要創建很多,因此就需要用到工廠模式。 ...
  • 序列類型 str 字元型 list 列表 tuple 元組 列表與元組最大的區別就是列表可變,而元組不可變 遍歷 從頭到尾,依次訪問到每一個 range() 包頭不包尾 range(start,end,step) start 開始 end 結束 step 步長(步長可以是負數) 下標(索引) 序列類 ...
  • 前言 Tkinter(即 tk interface) 是 Python 標準 GUI 庫,簡稱 “Tk”;從本質上來說,它是對 TCL/TK 工具包的一種 Python 介面封裝。Tkinter 是 Python 自帶的標準庫,因此無須另行安裝,它支持跨平臺運行,不僅可以在 Windows 平臺上運 ...
  • 編寫一個帶有socket通信功能的插件,x64dbg運行後,用戶點擊鏈接按鈕可直接連接到外部的python中,python作為服務端,當x64dbg內部出現某個事件後,自動將消息推送到外部python腳本上,實現反向傳參的目的。 ...
  • 鑒於有些小伙伴在尋找博客園遷移到個人博客的方案,本人針對博客園實現了一個自動備份腳本,可以快速將博客園中自己的文章備份成Markdown格式的獨立文件,備份後的md文件可以直接放入到hexo博客中,快速生成自己的站點,而不需要自己逐篇文章遷移,提高了備份文章的效率。 ...
  • 阿裡druid-spring-boot-starter 配置,個人整理(之後可能會忘記)。。 現版本其實有大量的預設值都已經配置好了,可以自己去看看源碼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...