国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Python】sqlmodel: Python 數(shù)據(jù)庫管理ORM 的終極形態(tài)?

這篇具有很好參考價(jià)值的文章主要介紹了【Python】sqlmodel: Python 數(shù)據(jù)庫管理ORM 的終極形態(tài)?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

ORM

大家都知道ORM(Object Relational Mapping)是一種將對(duì)象和關(guān)系數(shù)據(jù)庫中的表進(jìn)行映射的技術(shù),它可以讓開發(fā)者更加方便地操作數(shù)據(jù)庫,而不用直接使用SQL語句。

直接使用SQL語句操作數(shù)據(jù)庫,雖然可以讓開發(fā)者直接與數(shù)據(jù)庫打交道,但手動(dòng)編寫SQL語句,容易出錯(cuò),而且靈活性上比較欠缺。相比之下,使用ORM(以SQLAlchemy為例)有更加易于使用、更加靈活、能防止 SQL 注入攻擊、更加易于測(cè)試的優(yōu)勢(shì)。

點(diǎn)擊查看優(yōu)勢(shì)說明

更加易于使用: 可以使用 Python 對(duì)象來表示數(shù)據(jù)庫中的表和行,而不是直接使用 SQL 語句。這樣可以使代碼更加易于編寫和維護(hù)。
更加靈活: SQLAlchemy 提供了靈活的查詢語言,可以通過鏈?zhǔn)秸{(diào)用的方式構(gòu)建復(fù)雜的查詢語句。同時(shí),SQLAlchemy 支持多種數(shù)據(jù)庫,可以在不同的數(shù)據(jù)庫之間進(jìn)行切換,而不需要修改代碼。
防止 SQL 注入攻擊: SQLAlchemy 提供了參數(shù)化查詢的方式,可以有效地防止 SQL 注入攻擊。使用參數(shù)化查詢可以將用戶輸入的數(shù)據(jù)轉(zhuǎn)換為參數(shù),從而避免了 SQL 注入攻擊。
更加易于測(cè)試: 使用 SQLAlchemy 可以將業(yè)務(wù)邏輯和數(shù)據(jù)庫操作分離,從而使得代碼更加易于測(cè)試??梢酝ㄟ^ Mock 對(duì)象模擬數(shù)據(jù)庫操作,從而進(jìn)行單元測(cè)試和集成測(cè)試。
...

當(dāng)然,使用 SQLAlchemy 也會(huì)增加代碼的復(fù)雜度,需要學(xué)習(xí)額外的知識(shí)和 API。因此,在實(shí)際應(yīng)用中需要根據(jù)具體情況進(jìn)行選擇。

那么有沒有一種技術(shù)或者框架 既不用增加太多的應(yīng)用成本,又兼具以SQLAlchemy為代表的ORM 框架的優(yōu)勢(shì) 呢?答案是肯定的,那就是我們今天介紹的主角 sqlmodel.

我們就以 Fastapi 開發(fā)創(chuàng)建用戶查詢用戶 兩個(gè)功能的接口來對(duì)比一下 ,SQLAlchemysqlmodelsqlmodel 和 只使用 SQL的差異。

使用SQLAlchemy

安裝

pip install sqlalchemy

示例代碼

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import Session, declarative_base, sessionmaker

SQLALCHEMY_DATABASE_URL = "mysql://user:password@host:port/database"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

app = FastAPI()

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(50))
    age = Column(Integer)

class UserIn(Base):
    name: str
    age: int

class UserOut(Base):
    id: int
    name: str
    age: int

class UserUpdate(Base):
    name: Optional[str] = None
    age: Optional[int] = None

Base.metadata.create_all(bind=engine)

def get_db():
    db = None
    try:
        db = SessionLocal()
        yield db
    finally:
        db.close()

def create_user(db: Session, user: UserIn):
    db_user = User(name=user.name, age=user.age)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

def read_user(db: Session, user_id: int):
    db_user = db.query(User).filter(User.id == user_id).first()
    if not db_user:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user

def read_all_user(db: Session, ):
    db_user = db.query(User).all()
    if not db_user:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user

@app.post("/users/", response_model=UserOut)
async def create_user_view(user: UserIn, db: Session = Depends(get_db)):
    return create_user(db, user)

@app.get("/users/{user_id}", response_model=UserOut)
async def read_user_view(user_id: int, db: Session = Depends(get_db)):
    return read_user(db, user_id)

@app.get("/users/", response_model=UserOut)
async def read_all_user_view(db: Session = Depends(get_db)):
    return read_all_user(db)

代碼解釋

User 是數(shù)據(jù)模型類的名稱,idname、age 是表中的列名。UserIn 是創(chuàng)建用戶的請(qǐng)求參數(shù)模型,UserOut 是查詢用戶的響應(yīng)數(shù)據(jù)模型,UserUpdate 是更新用戶的請(qǐng)求參數(shù)模型。

使用 create_engine 函數(shù)創(chuàng)建一個(gè)數(shù)據(jù)庫連接引擎,使用 sessionmaker 函數(shù)創(chuàng)建一個(gè)數(shù)據(jù)庫會(huì)話工廠,使用 declarative_base 函數(shù)創(chuàng)建一個(gè)基類。在創(chuàng)建表時(shí),使用 Base.metadata.create_all 函數(shù)創(chuàng)建表。

使用 get_db 函數(shù)獲取數(shù)據(jù)庫會(huì)話對(duì)象,使用 create_userread_user 函數(shù)進(jìn)行數(shù)據(jù)庫操作。在視圖函數(shù)中,只需要調(diào)用這些函數(shù)即可完成相應(yīng)的業(yè)務(wù)邏輯。

上面的代碼已經(jīng)非常簡(jiǎn)潔直觀,但是還是有有一定的學(xué)習(xí)成本,下面我們來看下使用我們今天的主角 -- sqlmodel 需要怎樣來實(shí)現(xiàn)上面的接口。

使用sqlmodel

安裝 sqlmodel

pip install sqlmodel

示例代碼


點(diǎn)擊查看完整代碼
# -*- coding: utf-8 -*-
"""
@File   :dda.py
@Date   :2023-06-05
@user   :bingoHe
"""
from typing import Optional

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from sqlmodel import SQLModel, Field, create_all, Session as SQLModelSession

SQLALCHEMY_DATABASE_URL = "mysql://user:password@host:port/database"

engine = create_engine(SQLALCHEMY_DATABASE_URL)

app = FastAPI()

class UserBase(SQLModel):
    name: Optional[str] = None
    age: Optional[int] = None

class User(UserBase, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)

class UserIn(UserBase):
    pass

class UserOut(UserBase):
    id: int

class UserUpdate(UserBase):
    pass


create_all(engine)

def get_db():
    """獲取數(shù)據(jù)庫會(huì)話對(duì)象"""
    db = None
    try:
        db = SQLModelSession(engine)
        yield db
    finally:
        db.close()

def create_user(db: SQLModelSession, user: UserIn):
    """創(chuàng)建用戶"""
    db_user = User.from_orm(user)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

def read_user(db: SQLModelSession, user_id: int):
    """查詢用戶"""
    db_user = db.get(User, user_id)
    if not db_user:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user

@app.post("/users/", response_model=UserOut)
async def create_user(user: UserIn, db: SQLModelSession = Depends(get_db)):
    """創(chuàng)建用戶"""
    return create_user(db, user)

@app.get("/users/{user_id}", response_model=UserOut)
async def read_user(user_id: int, db: SQLModelSession = Depends(get_db)):
    """查詢用戶"""
    return read_user(db, user_id)

SQLAlchemy的主要使用差異在參數(shù)的定義上,使用多處繼承,而不是各自定義的方法:

# Code above omitted ??
...
class UserBase(SQLModel):
    name: Optional[str] = None
    age: Optional[int] = None

class User(UserBase, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)

class UserIn(UserBase):
    pass

class UserOut(UserBase):
    id: int

class UserUpdate(UserBase):
    pass
...
# Code below omitted ??

繼承這一點(diǎn)對(duì)于還在頻繁迭代的系統(tǒng)中非常重要,因?yàn)橥瑯犹砑?一個(gè)user的數(shù)據(jù)結(jié)構(gòu),SQLAlchemy需要修改4處地方,而sqlmodel 僅僅只需要修改一處。如果有多個(gè)表,這個(gè)便利性的優(yōu)勢(shì)會(huì)尤為突出。

這也就引出了sqlmodel具有的優(yōu)勢(shì):

  • 簡(jiǎn)短: 最小化代碼重復(fù)。一個(gè)單一的類型注解做了很多工作。無需在 SQLAlchemy 和 Pydantic 中復(fù)制模型。
  • 簡(jiǎn)單易用: API 設(shè)計(jì)簡(jiǎn)單易用,強(qiáng)大的編輯器支持,學(xué)習(xí)曲線較低,可以快速上手。它使用 Python 類型注解來定義數(shù)據(jù)模型,可以自動(dòng)推斷數(shù)據(jù)庫表結(jié)構(gòu),同時(shí)支持類型檢查和數(shù)據(jù)驗(yàn)證。
  • 可擴(kuò)展: 擁有 SQLAlchemyPydantic 的所有功能。
  • 高性能sqlmodel 采用了一些性能優(yōu)化策略,比如使用預(yù)編譯 SQL 語句、減少數(shù)據(jù)庫連接次數(shù)等,可以提高數(shù)據(jù)庫操作的性能。
  • 支持異步操作: sqlmodel 支持異步操作,可以與 asyncio 庫一起使用,可以在高并發(fā)場(chǎng)景下提高程序的性能。
  • 支持原生 SQL: sqlmodel 支持原生 SQL,可以使用原生 SQL 語句進(jìn)行數(shù)據(jù)庫操作,同時(shí)還支持參數(shù)綁定和 SQL 注入防護(hù)。

SQLModel 實(shí)際上是在 Pydantic 和 SQLAlchemy 之間增加了一層兼容適配,經(jīng)過精心設(shè)計(jì)以兼容兩者。SQLModel 旨在簡(jiǎn)化 FastAPI 應(yīng)用程序中與 SQL 數(shù)據(jù)庫的交互。它結(jié)合了 SQLAlchemy 和 Pydantic,并嘗試盡可能簡(jiǎn)化代碼,讓代碼重復(fù)減少到最低限度,同時(shí)盡可能讓開發(fā)人員獲得最佳的開發(fā)體驗(yàn)。

原生的SQL語句支持舉例

有時(shí)候我們可能需要使用原生的SQL語句來進(jìn)行一些復(fù)雜的操作。

from sqlmodel import create_engine, Session

# 創(chuàng)建數(shù)據(jù)庫引擎
engine = create_engine("sqlite:///example.db")

# 創(chuàng)建Session對(duì)象
with Session(engine) as session:
    # 執(zhí)行原生的SQL語句
    result = session.execute("SELECT * FROM users WHERE age > :age", {"age": 18})

    # 處理查詢結(jié)果
    for row in result:
        print(row)

高級(jí)用法:結(jié)合mixin類,簡(jiǎn)化數(shù)據(jù)庫操作

結(jié)合mixin類,簡(jiǎn)化數(shù)據(jù)庫操作,一處封裝,處處適用。

如果熟悉fastapi,且仔細(xì)觀察上面的完整代碼就會(huì)發(fā)現(xiàn),除了下面這段,其他的都是標(biāo)準(zhǔn)的Fastapi 接口開發(fā)需要的信息。而這樣的操作結(jié)合我們接下來介紹的mixin方法,就可以給這只虎添上翅膀。
class User(UserBase, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)

tips: 在面向?qū)ο缶幊讨?,Mixin是一種重用代碼的方式,它是一個(gè)類,包含一些方法和屬性,可以被其他類繼承和使用。Mixin類通常不是獨(dú)立的類,而是用于增強(qiáng)其他類的功能。Mixin類的優(yōu)點(diǎn)在于可以將代碼分解為小的、可重用的部分,從而減少代碼的重復(fù)和冗余。Mixin類可以被多個(gè)類繼承,從而避免了多重繼承的問題。

import uvicorn
from typing import Optional, Union

from fastapi import FastAPI, Depends, HTTPException
from sqlmodel import Field, Session, SQLModel, create_engine, select


class ActiveRecord(SQLModel):
    @classmethod
    def by_id(cls, _id: int, session):
        obj = session.get(cls, _id)
        if obj is None:
            raise HTTPException(status_code=404, detail=f"{cls.__name__} with id {id} not found")
        return obj

    @classmethod
    def all(cls, session):
        return session.exec(select(cls)).all()

    @classmethod
    def create(cls, source: Union[dict, SQLModel], session):
        if isinstance(source, SQLModel):
            obj = cls.from_orm(source)
        # elif isinstance(source, dict):
        elif isinstance(source, dict):
            obj = cls.parse_obj(source)
        session.add(obj)
        session.commit()
        session.refresh(obj)
        return obj

    def save(self, session):
        session.add(self)
        session.commit()
        session.refresh(self)


class UserBase(SQLModel):
    name: Optional[str] = None
    age: Optional[int] = None


class User(UserBase, ActiveRecord, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    __table_args__ = {'extend_existing': True}


class UserIn(UserBase):
    pass


class UserOut(UserBase):
    id: int


class UserUpdate(UserBase):
    pass

# 注意:需要提前安裝pymysql, pip install pymysql
SQLALCHEMY_DATABASE_URL = "mysql+pymysql://user:password@host:port/database"

engine = create_engine(SQLALCHEMY_DATABASE_URL)


def create_db_and_tables():
    SQLModel.metadata.create_all(engine)


def get_session():
    with Session(engine) as session:
        yield session


app = FastAPI()


@app.on_event("startup")
def on_startup():
    create_db_and_tables()


@app.post("/User/", response_model=UserOut)
def create_user(hero: UserIn, session: Session = Depends(get_session)):
    return User.create(hero, session)

@app.get("/User/", response_model=list[UserOut])
def read_user(session: Session = Depends(get_session)):
    return User.all(session)

@app.get("/User/{user_id}", response_model=UserOut)
def read_user(user_id: int,session: Session = Depends(get_session)):
    return User.by_id(user_id, session)


if __name__ == '__main__':
    uvicorn.run("main:app", reload=True)

總結(jié)

使用SQLModel + mixins可以在公共的邏輯里面實(shí)現(xiàn)增刪改查操作,處封裝,處處適用,減少了代碼的重復(fù)性和冗余性。

特點(diǎn) SQLAlchemy sqlmodel
數(shù)據(jù)庫支持 支持多種數(shù)據(jù)庫,包括MySQL、PostgreSQL、SQLite等 支持多種數(shù)據(jù)庫,包括MySQL、PostgreSQL、SQLite等
ORM功能 提供全面的ORM功能,支持對(duì)象關(guān)系映射、事務(wù)處理、查詢構(gòu)建等 提供輕量級(jí)的ORM功能,支持對(duì)象關(guān)系映射、查詢構(gòu)建等
性能 性能較好,支持緩存、連接池等優(yōu)化手段 性能較好,支持緩存、連接池等優(yōu)化手段
學(xué)習(xí)難度 學(xué)習(xí)曲線較陡峭,需要掌握復(fù)雜的概念和API 學(xué)習(xí)曲線較平緩,易于上手和使用
文檔和社區(qū)支持 提供完善的文檔和活躍的社區(qū)支持 文檔和社區(qū)支持相對(duì)較少
代碼規(guī)范 代碼規(guī)范較為靈活,可以自由組織代碼結(jié)構(gòu) 代碼規(guī)范較為嚴(yán)格,需要按照規(guī)范組織代碼結(jié)構(gòu)

建議:

根據(jù)上述比較,我們可以得出以下選擇建議:文章來源地址http://www.zghlxwxcb.cn/news/detail-473555.html

  • 如果需要使用全面的ORM功能,或者需要使用復(fù)雜的查詢構(gòu)建和事務(wù)處理等功能,建議選擇SQLAlchemy。
  • 如果需要使用輕量級(jí)的ORM功能,或者需要快速上手和使用,建議選擇sqlmodel。
  • 如果需要支持多種數(shù)據(jù)庫,建議兩者都可以考慮使用。
  • 如果對(duì)文檔和社區(qū)支持有較高的要求,建議選擇SQLAlchemy。
  • 如果對(duì)代碼規(guī)范有較高的要求,建議選擇sqlmodel。

到了這里,關(guān)于【Python】sqlmodel: Python 數(shù)據(jù)庫管理ORM 的終極形態(tài)?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Flutter教程之 Flutter 開發(fā)者的終極 Hive 數(shù)據(jù)庫管理工具

    Flutter教程之 Flutter 開發(fā)者的終極 Hive 數(shù)據(jù)庫管理工具

    作為 Flutter 開發(fā)人員,您知道 Hive 是一個(gè)功能強(qiáng)大、輕量級(jí)且易于使用的鍵值數(shù)據(jù)庫,適用于您的 Flutter 應(yīng)用程序。但是管理 Hive 數(shù)據(jù)庫可能有點(diǎn)棘手,尤其是當(dāng)您使用多個(gè)框和表時(shí)。這就是為什么我很高興地宣布推出Flutter 的原因hive_ui,這是一個(gè)新的 Flutter 包,可以讓您輕

    2024年02月09日
    瀏覽(23)
  • Django、數(shù)據(jù)庫----------ORM框架

    Django、數(shù)據(jù)庫----------ORM框架

    目錄 1.安裝第三方模塊 2.ORM 1.自己創(chuàng)建數(shù)據(jù)庫 2.django連接數(shù)據(jù)庫 3.django操作表 創(chuàng)建表:在models.py文件中 刪除表以及修改表 在表中新增列時(shí),由于已存在列中可能已有數(shù)據(jù),所以新增列必須要指定新增列對(duì)應(yīng)的數(shù)據(jù) Django開發(fā)操作數(shù)據(jù)庫更簡(jiǎn)單,內(nèi)部提供了ORM框架。 ? ORM可以

    2024年02月09日
    瀏覽(42)
  • Django ORM:最全面的數(shù)據(jù)庫處理指南

    深度探討Django ORM的概念、基礎(chǔ)使用、進(jìn)階操作以及詳細(xì)解析在實(shí)際使用中如何處理數(shù)據(jù)庫操作。同時(shí),我們還討論了模型深入理解,如何進(jìn)行CRUD操作,并且深化理解到數(shù)據(jù)庫遷移等高級(jí)主題。為了全面解讀Django ORM,我們也討論了其存在的不足,并對(duì)其未來發(fā)展進(jìn)行了展望。

    2024年02月13日
    瀏覽(25)
  • SQLAlchemy ORM指南:簡(jiǎn)化數(shù)據(jù)庫操作的最佳實(shí)踐

    SQLAlchemy ORM指南:簡(jiǎn)化數(shù)據(jù)庫操作的最佳實(shí)踐

    背景: ? SQLAlchemy是一個(gè)數(shù)據(jù)庫的ORM框架,讓我們操作數(shù)據(jù)庫的時(shí)候不要再用SQL語句了,跟直接操作模型一樣。操作十分便捷,其實(shí)SQLAlchemy應(yīng)該是在Flask和Django應(yīng)用的特別多,而且在flask中已經(jīng)集成了flask_sqlalchemy ,好像是 SQLAlchemy的作者和 Flask是同一個(gè),背景了解到這里就可

    2024年01月20日
    瀏覽(58)
  • 【1 beego學(xué)習(xí) -MAC框架與ORM數(shù)據(jù)庫】

    【1 beego學(xué)習(xí) -MAC框架與ORM數(shù)據(jù)庫】

    1,由于在github上安裝,所以需要安裝git軟件,安裝過程一直點(diǎn)擊下一步即可。安裝完成后需要配置環(huán)境變量 修改go環(huán)境變量 go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn 2,設(shè)置GOPATH 環(huán)境變量,并且將 GOPATH/bin 加入到了環(huán)境變量。 3,安裝bee go get -u -v github.com/astaxie/beego go get

    2024年02月11日
    瀏覽(20)
  • Django創(chuàng)建應(yīng)用、ORM的進(jìn)階使用及模型類數(shù)據(jù)庫遷移

    Django創(chuàng)建應(yīng)用、ORM的進(jìn)階使用及模型類數(shù)據(jù)庫遷移

    Django 項(xiàng)目就是基于 Django 框架開發(fā)的 Web 應(yīng)用,它包含了一組配置和多個(gè)應(yīng)用,我們把應(yīng)用稱之為 App,在前文中對(duì)它也做了相應(yīng)的介紹,比如 auth、admin,它們都屬于 APP。 一個(gè) App 就是一個(gè) Python 包,通常一個(gè) App 可以包含模型、視圖、模板和 URL 配置文件,可以被應(yīng)用到多個(gè)

    2024年02月09日
    瀏覽(94)
  • Java與數(shù)據(jù)庫:JDBC和ORM框架的使用和效率優(yōu)化

    Java與數(shù)據(jù)庫:JDBC和ORM框架的使用和效率優(yōu)化

    ? 隨著互聯(lián)網(wǎng)的快速發(fā)展和大數(shù)據(jù)時(shí)代的到來,數(shù)據(jù)庫在軟件開發(fā)中起到了至關(guān)重要的作用。Java作為一門強(qiáng)大而廣泛應(yīng)用的編程語言,提供了多種與數(shù)據(jù)庫交互的方式。其中,JDBC和ORM框架是最常用的兩種方式。本文將深入探討JDBC和ORM框架的使用方法,并分享一些提高效率的

    2024年02月08日
    瀏覽(54)
  • Django學(xué)習(xí)記錄:使用ORM操作MySQL數(shù)據(jù)庫并完成數(shù)據(jù)的增刪改查

    Django學(xué)習(xí)記錄:使用ORM操作MySQL數(shù)據(jù)庫并完成數(shù)據(jù)的增刪改查

    數(shù)據(jù)庫操作 MySQL數(shù)據(jù)庫+pymysql Django開發(fā)操作數(shù)據(jù)庫更簡(jiǎn)單,內(nèi)部提供了ORM框架。 安裝第三方模塊 ORM可以做的事: 1、創(chuàng)建、修改、刪除數(shù)據(jù)庫中的表(不用寫SQL語句)。【無法創(chuàng)建數(shù)據(jù)庫】 2、操作表中的數(shù)據(jù)(不用寫SQL語句)。 1、自己創(chuàng)建數(shù)據(jù)庫 1)啟動(dòng)MySQL服務(wù) 2)自帶

    2024年02月14日
    瀏覽(97)
  • 獻(xiàn)給轉(zhuǎn)java的c#和java程序員的數(shù)據(jù)庫orm框架

    一個(gè)好的程序員不應(yīng)被語言所束縛,正如我現(xiàn)在開源java的orm框架一樣,如果您是一位轉(zhuǎn)java的c#程序員,那么這個(gè)框架可以帶給你起碼沒有那么差的業(yè)務(wù)編寫和強(qiáng)類型體驗(yàn)。如果您是一位java程序員,那么該框架可以提供比 Mybatis-Plus 功能更加豐富、性能更高,更加輕量和完全免費(fèi)的體

    2024年02月05日
    瀏覽(18)
  • 梅西生涯數(shù)據(jù)管理系統(tǒng)(Python+數(shù)據(jù)庫)

    梅西生涯數(shù)據(jù)管理系統(tǒng)(Python+數(shù)據(jù)庫)

    用 Tkinter + MySQL 實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)分析系統(tǒng),一起來看看吧! 本篇博客主要分為兩大部分,一部分主要是對(duì)數(shù)據(jù)庫的操作,另一部分主要是使用Python進(jìn)行一些程序設(shè)計(jì)與數(shù)據(jù)分析。 代碼下載地址:https://download.csdn.net/download/m0_68111267/88029856 python tkinter mysql 1. 導(dǎo)入數(shù)據(jù) 以下是My

    2024年02月08日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包