python----python使用mysql

来源:https://www.cnblogs.com/charles8866/archive/2018/03/07/8520218.html
-Advertisement-
Play Games

Python操作MySQL主要使用兩種方式: 原生模塊 pymsql ORM框架 SQLAchemy pymql pymsql是Python中操作MySQL的模塊,在windows中的安裝: 入門:我們連接虛擬機中的centos中的mysql,然後查詢test資料庫中student表的數據 運行結果 ...


Python操作MySQL主要使用兩種方式:

  原生模塊 pymsql

  ORM框架 SQLAchemy

pymql

 pymsql是Python中操作MySQL的模塊,在windows中的安裝:

pip install pymysql

 

入門:我們連接虛擬機中的centos中的mysql,然後查詢test資料庫中student表的數據

import pymysql

#創建連接
conn = pymysql.connect(host='192.168.123.207',port=3306,user='root',passwd='root',db="test");

#創建游標
cursor = conn.cursor()

#執行sql,並返回受影響的行數
effect_row = cursor.execute("select * from student")

print(effect_row)

運行結果:

需要給許可權

mysql> grant all on *.* to 'root'@'%' identified by 'root';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

 這個時候我們在運行上面的程式我們就可以看到,運行成功

 

這是說明查詢到了5條數據,那如果我們需要查看這五條具體的數據是什麼,我們要用:

print(cursor.fetchone())

 cursor.fetchone()是一條一條的把數據取出來

這裡我們用了兩條cursor.fetchone()

如果我們想要只取出前3條數據:

print('>>>>>',cursor.fetchmany(3))

 

一次性取出所有數據:

print('------',cursor.fetchall())

如果我們要插入多條數據:

import pymysql

#創建連接
conn = pymysql.connect(host='192.168.123.207',port=3306,user='root',passwd='root',db="test");

#創建游標
cursor = conn.cursor()
data = [
    ("N1",23,"2015-01-01","M"),
    ("N2",24,"2015-01-02","F"),
    ("N3",25,"2015-01-03","M"),
]
#執行sql,並返回受影響的行數
effect_row = cursor.executemany("insert into student (name,age,register_date,gender)values(%s,%s,%s,%s)",data)

conn.commit()

 

註:executemany預設會啟動一個事務,如果沒有conn.commit(),數據將不會被插入成功

 

sqlalchemy ORM

1.ORM介紹

orm英文全稱object relational mapping,就是對象映射關係程式,簡單來說類似python這種面向對象的程式來說一切皆對象,我們實例化一個對象,通過點的形式來調用裡面的函數。orm相當於把資料庫給實例化了,資料庫都是關係型的,通過orm將編程語言的對象模型和資料庫的關係模型建立映射關係,這樣我們在使用編程語言對資料庫進行操作的時候可以直接使用編程語言的對象模型進行操作就可以了,而不用直接使用sql語言。

優點:

1.隱藏了數據訪問細節,“封閉”的通用資料庫交互,ORM的核心。他使得我們的通用資料庫交互變得簡單易行,並且完全不用考慮該死的SQL語句

2.ORM使我們構造固化數據結構變得簡單易行

2.sqlalchemy安裝

安裝:

pip install sqlalchemy

3.sqlalchemy基本使用 

 首先我們看一下我們沒有用orm之前我們創建一個數據表是這個樣的:

create table student(
   id int auto_increment,
   name char(32) not null,
   age int not null,
   register_date date not null,
   primary key(id)    
);

 使用了orm,實現上面的表的創建,代碼如下:

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String

engine = create_engine("mysql+pymysql://root:[email protected]/test",encoding='utf-8',echo=True)
Base = declarative_base()#生成orm基類

class User(Base):
    __tablename__ = 'user'#表名
    id = Column(Integer,primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

Base.metadata.create_all(engine)#創建表結構

 

 用orm創建一條數據:

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String
from sqlalchemy.orm import sessionmaker


engine = create_engine("mysql+pymysql://root:[email protected]/test",encoding='utf-8',echo=True)
Base = declarative_base()#生成orm基類

class User(Base):
    __tablename__ = 'user'#表名
    id = Column(Integer,primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

Base.metadata.create_all(engine)#創建表結構

Session_class = sessionmaker(bind=engine)#創建與資料庫的會話session class ,註意這裡返回給session的是一個類,不是實例
Session = Session_class()#生成session實例

user_obj = User(name = "xiaoming" , password = "123456")#生成你要創建的數據對象
user_obj2 = User(name = "jack" , password = "123564")#生成你要創建的數據對象
print(user_obj.name,user_obj.id)#此時還沒有創建對象,列印一下會發現id還是None

Session.add(user_obj)
Session.add(user_obj2)


print(user_obj.name,user_obj.id)#此時也依然還沒有創建

Session.commit()#現在才統一提交,創建數據

插入數據是使用sessionmaker,通過綁定上面創建的連接創建出一個類,生成session實例(相當於之前的cursor),用面向對象的方式創建兩條記錄,然後添加,最後commit就可以了

 

下麵我們來看看資料庫的增刪改查:

查詢:

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String
from sqlalchemy.orm import sessionmaker

engine = create_engine("mysql+pymysql://root:[email protected]/test",encoding='utf-8')
Base = declarative_base()#生成orm基類

class User(Base):
__tablename__ = 'user'#表名
id = Column(Integer,primary_key=True)
name = Column(String(32))
password = Column(String(64))

Base.metadata.create_all(engine)#創建表結構

Session_class = sessionmaker(bind=engine)#創建與資料庫的會話session class ,註意這裡返回給session的是一個類,不是實例
Session = Session_class()#生成session實例
data=Session.query(User).filter_by(name="xiaoming").all()
#print(data[0].name,data[0].password)
print(data)

 如果只是Session.query(User).filter_by(name="xiaoming"),只會看到一條sql語句:

filter_by()查出來的是一個列表,是一組數據

加上.all()

這個是一個對象,這也看不出來是那個,所以我們要手動去調出數據

我們用print(data[0].name,data[0].password):

這樣就查出了數據

現在是查一條數據,如果filter_by()裡面什麼都不寫:

data=Session.query(User).filter_by().all()

 

我們就查出了好幾條數據,我們要迴圈才能看出來具體的數據。我們想要直接看到誰是誰,我們怎麼辦呢?

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String
from sqlalchemy.orm import sessionmaker


engine = create_engine("mysql+pymysql://root:[email protected]/test",encoding='utf-8')
Base = declarative_base()#生成orm基類

class User(Base):
    __tablename__ = 'user'#表名
    id = Column(Integer,primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        return "<%s name:%s>" % (self.id,self.name)
Base.metadata.create_all(engine)#創建表結構

Session_class = sessionmaker(bind=engine)#創建與資料庫的會話session class ,註意這裡返回給session的是一個類,不是實例
Session = Session_class()#生成session實例

data=Session.query(User).filter_by().all()

print(data)

 我們添加了__repr__()函數,這樣看看運行結果:

這樣就顯現出我們查詢的結果了。就相當於,如果你要查看什麼數據,以什麼格式的方式顯示,就可以在__repr__這個函數中設置

在這裡,我們用filter_by().all()查詢出所有的數據,那我們用filter_by().first(),就可以查詢出資料庫中的第一條數據 

上面我們用filter_by(name="xiaoming")查詢出了姓名為xiaoming的數據,那我們想要查詢用戶id>1的數據應該怎麼查詢呢?

data=Session.query(User).filter(User.id>1).all()
多個條件查詢:再加幾個filter
data=Session.query(User).filter(User.id>1).filter(User.id<3).all()

 

 修改:

data=Session.query(User).filter(User.id>1).first()
print(data)
data.name = "Jack Chen"
data.password = "555555"
Session.commit()

查詢到你要修改的這個數據,然後想修改面向對象里的數據一樣,對數據進行修改,最後commit()就可以了

 

刪除:

data = Session.query(User).filter_by(name = 'Rain').first()
Session.delete(data)
Session.commit()

 

同樣的,先查詢到要刪除的數據,然後對數據進行刪除,最後提交commit

 

回滾:

fake_user = User(name = 'Rain',password = "123456")
Session.add(fake_user)
print(Session.query(User).filter(User.name.in_(['jack','rain'])).all())#這時候看看session里有了剛剛添加的數據

Session.rollback()#此時你rollback一下

print(Session.query(User).filter(User.name.in_(['jack','rain'])).all())#再查就發現剛剛添加的數據就沒有了

運行結果看看:

這個時候可以看到一開始我們是能夠看到剛剛插入的數據,但是回滾之後我們就看不到了,我們到資料庫中看看:

 

我們插入一條數據看看

可以看出我們插入的數據的id是4,這樣看來確實是先插入進去,然後回滾之後刪除的

 

分組 統計:

統計:

Session.query(User).filter(User.name.in_(['xiaoming','rain'])).count()

 分組:

from sqlalchemy import func
print(Session.query(func.count(User.name),User.name).group_by(User.name).all())

 

 join多表查詢:

Session.query(User,Student).filter(User.id == Student.id).all()

Session.query(User).join(Student).all()#這種寫法必須要求兩個表有外鍵關聯

外鍵關聯

我們先創建兩個表student,study_record:

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,DATE,ForeignKey
from sqlalchemy.orm import sessionmaker

engine = create_engine("mysql+pymysql://root:[email protected]/xumingdb",encoding='utf-8')
Base = declarative_base()#生成orm基類

class Student(Base):
    __tablename__ = 'student'#表名
    id = Column(Integer,primary_key=True)
    name = Column(String(32),nullable=False)
    register_date = Column(DATE,nullable=False)

    def __repr__(self):
        return "<%s name:%s>" % (self.id,self.name)

class StudyRecord(Base):
    __tablename__ = 'study_record'#表名
    id = Column(Integer,primary_key=True)
    day = Column(Integer,nullable=False)
    status = Column(String(32),nullable=False)
    stu_id = Column(Integer,ForeignKey("student.id"))

    def __repr__(self):
        return "<%s day:%s>" % (self.id,self.day)
Base.metadata.create_all(engine)#創建表結構

 

外鍵表的創建,要用到ForeignKey("student.id")裡面就直接是表名.欄位名 

然後向兩個表中插入數據:

Base.metadata.create_all(engine)#創建表結構
Session_class = sessionmaker(bind=engine)
session = Session_class()

s1 = Student(name = "xiaoming",register_date="2015-06-07")
s2 = Student(name = "huahua",register_date="2015-06-08")
s3 = Student(name = "caicai",register_date="2015-06-09")
s4 = Student(name = "zhazha",register_date="2015-06-04")

study_obj1 = StudyRecord(day = 1,status = "YES",stu_id=1)
study_obj2 = StudyRecord(day = 2,status = "NO",stu_id=1)
study_obj3 = StudyRecord(day = 3,status = "YES",stu_id=1)
study_obj4 = StudyRecord(day = 1,status = "YES",stu_id=2)
session.add_all([s1,s2,s3,s4])
session.add_all([study_obj1,study_obj2,study_obj3,study_obj4])

session.commit()

 

 批量插入用add_all,裡面用一個列表放入要插入的數據,註意的是,因為建立了外鍵,所以在添加數據的時候,study_record的數據一定要在student表數據插入之後才能夠被插入,如果一起插入就會報錯

 現在我們要查詢xiaoming一共上了幾節課,那應該怎麼做呢:

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,DATE,ForeignKey
from sqlalchemy.orm import sessionmaker,relationship

engine = create_engine("mysql+pymysql://root:[email protected]/xumingdb",encoding='utf-8')
Base = declarative_base()#生成orm基類

class Student(Base):
    __tablename__ = 'student'#表名
    id = Column(Integer,primary_key=True)
    name = Column(String(32),nullable=False)
    register_date = Column(DATE,nullable=False)

    def __repr__(self):
        return "<%s name:%s>" % (self.id,self.name)

class StudyRecord(Base):
    __tablename__ = 'study_record'#表名
    id = Column(Integer,primary_key=True)
    day = Column(Integer,nullable=False)
    status = Column(String(32),nullable=False)
    stu_id = Column(Integer,ForeignKey("student.id"))

    student = relationship("Student",backref="my_study_record")

    def __repr__(self):
        return "<%s day:%s status:%s>" % (self.student.name,self.day,self.status)

Base.metadata.create_all(engine)#創建表結構
Session_class = sessionmaker(bind=engine)
session = Session_class()
stu_obj = session.query(Student).filter(Student.name=='xiaoming').first() 
print(stu_obj.my_study_record)
session.commit()

 註意上面代碼標紅的這個語句,我們引入了relationship,然後這個允許你在study_record表裡通過backref欄位反向查出所有它在student表裡的關聯項,實現了一個雙向查找,即關聯student表,在studyrecord中通過student欄位就可以查 student表中的所有欄位,反過來,我們可以在student表中通過 my_study_record欄位反查studyrecord裡面的數據,然後代表著我們在下麵查到的xiaoming,可以.my_study_record就可以查詢出在studyrecord表中還有xiaoming的id的數據項

 多外鍵關聯

 首先我們創建兩個表customer和address兩個表,其中customer表中有address的兩個外鍵:

import sqlalchemy
from sqlalchemy import Integer, ForeignKey, String, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:[email protected]/xumingdb",encoding='utf-8')
Base = declarative_base()


class Customer(Base):
    __tablename__ = 'customer'
    id = Column(Integer, primary_key=True)
    name = Column(String(64))

    billing_address_id = Column(Integer, ForeignKey("address.id"))
    shipping_address_id = Column(Integer, ForeignKey("address.id"))

    billing_address = relationship("Address")
    shipping_address = relationship("Address")


class Address(Base):
    __tablename__ = 'address'
    id = Column(Integer, primary_key=True)
    street = Column(String(64))
    city = Column(String(64))
    state = Column(String(64))
  def __repr__(self):
  return self.street
Base.metadata.create_all(engine) # 創建表結構

 然後我們向兩個表中插入數據:

from day12 import sqlalchemy_multi_fk

from sqlalchemy.orm  import sessionmaker

Session_class = sessionmaker(bind=sqlalchemy_multi_fk.engine)
session = Session_class()

addr1 = sqlalchemy_multi_fk.Address(street="XiZangBeiLu",city="ShangHai",state="ShangHai")
addr2 = sqlalchemy_multi_fk.Address(street="YuHu",city="XiangTan",state="HuNan")
addr3 = sqlalchemy_multi_fk.Address(street="ZhongXinZhen",city="SuQian",state="JiangSu")
session.add_all([addr1,addr2,addr3])

c1 = sqlalchemy_multi_fk.Customer(name="xiaoming",billing_address=addr1,shipping_address=addr2)
c2 = sqlalchemy_multi_fk.Customer(name="jack",billing_address=addr3,shipping_address=addr3)
session.add_all([c1,c2])
session.commit()

 

 這樣插入會出現一個錯誤:

sqlalchemy.exc.AmbiguousForeignKeysError: Could not determine join condition between parent/child tables on relationship Customer.billing_address - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.

說白了就是我們現在在做關聯查詢的時候,有兩個欄位同時關聯到了Address表中 ,在做反向查詢的時候它分不清楚誰是誰,通過address反向查的時候分不清哪個欄位代表billing_address,哪個欄位是代表了shipping_address.那我們怎麼解決呢?

billing_address = relationship("Address",foreign_keys=[billing_address_id])
shipping_address = relationship("Address",foreign_keys=[shipping_address_id])

在創建反向查詢的語句中添加foreign_keys參數就可以了

 

添加數據成功!!

這個時候我們要查詢customer的地址:

obj = session.query(sqlalchemy_multi_fk.Customer).filter(sqlalchemy_multi_fk.Customer.name=="xiaoming").first()
print(obj.name,obj.billing_address,obj.shipping_address)

 

 多對多關係

 現在讓我們設計一個能描述“圖書”與“作者”的關係的表結構,需求是:

1.一本書可以有好幾個作者一起出版

2.一個作者可以寫好幾本書

首先我們看一下一般的思路 :

兩個表,然後我們在遇到一本書有多個作者共同參與出版,就把作者id寫在一起,但是這樣不利於查詢

那我們可以再添加一張表:

這就實現了雙向的一對多,一個作者可以包含多本書,一本書可以包含多個作者。這就形成了多對多。

來看代碼的實現:

首先還是先建立數據表:

from sqlalchemy import Table, Column, Integer,String,DATE, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://root:[email protected]/xumingdb",encoding='utf-8')
Base = declarative_base()


Base = declarative_base()

book_m2m_author = Table('book_m2m_author', Base.metadata,
                        Column('book_id',Integer,ForeignKey('books.id')),
                        Column('author_id',Integer,ForeignKey('authors.id')),
                        )

class Book(Base):
    __tablename__ = 'books'
    id = Column(Integer,primary_key=True)
    name = Column(String(64))
    pub_date = Column(DATE)
    authors = relationship('Author',secondary=book_m2m_author,backref='books')

    def __repr__(self):
        return self.name

class Author(Base):
    __tablename__ = 'authors'
    id = Column(Integer, primary_key=True)
    name = Column(String(32))

    def __repr__(self):
        return self.name
Base.metadata.create_all(engine)  # 創建表結構

這裡我們使用了另外一種建立表的方式,建立了第三張表book_m2m_auther,這張表建立起來後基本上不需要我們去人為的添加數據,對用戶來講是不用關心這裡面有什麼數據,是由orm自動幫你維護的。也就不需要給它建立映射關係了。

但是在mysql端其實已經關聯上了,因為外鍵已經建立好了,在orm查詢的時候,還要做一個orm級別的 記憶體對象的映射:relationship,告訴book表和author表在查詢數據的時候去哪張表裡查詢。

所以看上面的紅色的代碼,通過secondary這個欄位去查第三張表。

這個時候就建立好了多對多的關係。我們就可以插入數據看效果:(先把表建立起來再說)

from day12 import sqlalchemy_multitomulti
from sqlalchemy.orm  import sessionmaker

Session_class=sessionmaker(bind=sqlalchemy_multitomulti.engine)
session = Session_class()

b1 = sqlalchemy_multitomulti.Book(name="book1",pub_date="2014-05-16")
b2 = sqlalchemy_multitomulti.Book(name="book2",pub_date="2012-03-16")
b3 = sqlalchemy_multitomulti.Book(name="book3",pub_date="2016-06-16")

a1 = sqlalchemy_multitomulti.Author(name="xiaoming")
a2 = sqlalchemy_multitomulti.Author(name="jack") 
a3 = sqlalchemy_multitomulti.Author(name="Rain")

b1.authors = [a1,a3]
b2.authors = [a2,a3]
b3.authors = [a1,a2,a3]

session.add_all([b1,b2,b3,a1,a2,a3])
session.commit()

上面紅色標記是建立關聯關係,這樣建立出來之後,book_m2m_author表自動就會有數據。

當然如果我們想要插入中文的書。即插入的數據有中文,我們要怎麼做呢:

engine = create_engine("mysql+pymysql://root:[email protected]/xumingdb?charset=utf8",encoding='utf-8')
Base = declarative_base()

 

需要在創建資料庫連接的時候在資料庫後面加上?charset=utf8

現在數據插入之後,最終要實現查詢數據:

1.查看作者xiaoming出版了多少本書:

author_obj = session.query(sqlalchemy_multitomulti.Author).filter(sqlalchemy_multitomulti.Author.name=="xiaoming").first()
print(author_obj.books)

2.查看書b2是哪些作者出版的 :

book_obj = session.query(sqlalchemy_multitomulti.Book).filter(sqlalchemy_multitomulti.Book.id==2).first()
print(book_obj.authors)

多對多刪除:

在刪除數據的時候我們也同樣的不需要管book_m2m_author表,sqlalchemy會自動幫我們把對應的數據刪除:

通過書刪除作者:

author_obj = session.query(sqlalchemy_multitomulti.Author).filter(sqlalchemy_multitomulti.Author.name=="xiaoming").first()
book_obj = session.query(sqlalchemy_multitomulti.Book).filter(sqlalchemy_multitomulti.Book.id==2).first()
book_obj.authors.remove(author_obj) session.commit()  

這個時候圖書2的關聯關係會自動少一個

 

直接刪除作者:

author_obj = session.query(sqlalchemy_multitomulti.Author).filter(sqlalchemy_multitomulti.Author.name=="xiaoming").first()
session.delete(author_obj)
session.commit()

 


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

-Advertisement-
Play Games
更多相關文章
  • 上一篇聊了聊批處理的缺點,對於無界數據來說, 流處理 會是更好的選擇,“流”指的是隨著時間的推移逐步增加的數據。消息隊列可以將這些流組織起來,快速的在應用程式中給予反饋。但是消息隊列與傳統的資料庫之間又存在著“剪不斷,理還亂”的“糾葛”,最後我們將探討通過消息隊列之中與時序有關的一些問題。 文件是批 ...
  • 這篇短文主要介紹 的集群和用 反向代理實現 負載均衡。 1、首先需要對一些知識點進行掃盲(對自己進行掃盲,囧): + 集群(Cluster) 簡單來說就是用N台伺服器構成一個松耦合的多處理器系統(對外是一個伺服器),內部通過網路實現通信。讓N台伺服器之間相互協作,共同承載一個網站的請求壓力。用知乎上 ...
  • Flask是一個輕量級的Web服務程式,它簡單、易用、靈活,這裡主要用來做一些API服務。 1. 相關鏈接 GitHub:https://github.com/pallets/flask 官方文檔:http://flask.pocoo.org 中文文檔:http://docs.jinkan.org/ ...
  • 2018-03-07 一、什麼是變數 變數的定義是: 用來命名一個數據的標示符1949 這是一個數字,代表某年如果要命名這個數字,在java里就會寫成: int 是數據類型,表示是整數year 是一個標識符= 是賦值操作符1949 是一個數字類型的值; 表示該行結束year 這個標識符就是一個變數, ...
  • 在網上找個很多的答案,但我的問題沒有解決,睡一晚上後,被我誤打誤撞地解決了,獻給遇到同樣問題的朋友。 方法一(eclipse): 網上大神的回答: 自己寫的程式是不建議用com.sun這個玩意兒的。。這東西屬於“Deprecated and restricted API”。。 而且各種com.sun ...
  • comparable 介面 Comparable<T> 類型參數:T - 可以與此對象進行比較的那些對象的類型 此介面強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。 實現此介面的對象列表(和數組)可以通過 Collectio ...
  • 原文鏈接:https://www.cnblogs.com/shanheyongmu/p/5863961.html 1. 什麼是逆向工程 mybatis的一個主要的特點就是需要程式員自己編寫sql,那麼如果表太多的話,難免會很麻煩,所以mybatis官方提供了一個逆向工程,可以針對單表自動生成myba ...
  • 一、現象:in a frame because it set 'X-Frame-Options' to 'deny'. 二、服務配置 因為,有時候為了防止網頁被別人的網站iframe,我們可以通過在服務端設置HTTP頭部中的X-Frame-Options信息。 X-Frame-Options 響應頭 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...