精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

FastAPI 實戰秘籍:從零構建高性能 API -數據庫篇

開發 數據庫
今天主要講一下通過 sqlalchemy 連接數據庫,數據庫會話,數據庫模型的創建和自動建表等。

前面我們講了Fastapi日志、配置管理,在web開發中主要是針對數據庫的增刪改查,今天主要講一下通過sqlalchemy連接數據庫,數據庫會話,數據庫模型的創建和自動建表等。

準備工作

對象關系映射操作庫:

pip install sqlalchemy

數據庫連接配置,在config.yaml中增加如下如下配置:

# config.yaml
database:
  url: "mysql+pymysql://root:123456@127.0.0.1:3306/zadmin"
  async_url: "mysql+asyncmy://root:123456@127.0.0.1:3306/zadmin"
  pool_size: 20
  echo_sql: false  # 是否打印SQL日志

需要安裝pymysql和asyncmy庫,處理同步及異步請求:

pip install pymysql asyncmy

在前面講解配置中我們設置了配置加載及定義:

# config.py

class DatabaseConfig(BaseModel):
    url: str
    async_url: str
    pool_size: int = 10
    echo_sql: bool = False

class Settings(BaseSettings):
    ...
    database: DatabaseConfig
    ...

數據庫連接

在core下創建database.py文件。使用sqlalchemy連接數據庫,數據源的定義如下:

database_url  dialect+driver://username:password@host:port/database

# 數據庫連接配置
# MySQL示例: mysql+pymysql://username:password@localhost/dbname
# PostgreSQL示例: postgresql+psycopg2://username:password@localhost/dbname

(1) 創建數據庫引擎(Engine)

# core/database.py

from sqlalchemy import create_engine
from sqlalchemy.ext.asyncio import create_async_engine
from config.config import get_settings

settings = get_settings()

# 異步引擎
async_engine = create_async_engine(
    url = settings.database.async_url,
    echo=settings.database.echo_sql,
    pool_size=settings.database.pool_size
)

# 同步引擎
engine = create_engine(
    url = settings.database.url,
    echo=settings.database.echo_sql,
    pool_size=settings.database.pool_size
)

(2) 創建會話工廠(Session Factory)

「會話工廠」是一個用于創建會話實例的工廠函數或類。它預先配置了會話的各種參數,但不會立即創建數據庫連接。

# core/database.py

# 同步會話工廠
session_local = sessionmaker(
    autocommit=False,
    autoflush=False,
    bind=engine)

# 異步會話工廠
session_factory = async_sessionmaker(
    autocommit=False,
    autoflush=False,
    bind=async_engine,
    expire_on_commit=True,
    class_=AsyncSession
)

(3) 創建會話(Session)

「會話」是SQLAlchemy ORM的核心,它代表了一個與數據庫的"對話",負責:

  • 管理對象狀態
  • 執行數據庫操作
  • 處理事務
  • 維護對象標識映射
# 異步會話
async def get_async_db():
    async with session_factory() as session:
        async with session.begin():
            yield session

# 同步會話
def get_db():
    with session_local() as session:
        yield session

不使用上下文管理器,也可以通過下面方式定義

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

基類定義及自動建表

# 定義基類,所有其它數據實體都繼承于它
Base = declarative_base()

# 如下示例:用戶表模型,除了__*__屬性,其它通過mapper或Column定義的都對應表的字段
# class User(Base):
#     __tablename__ = 'users'
#    __table_args__ = ({'comment': '用戶表'})
#    id: Mapped[int] = mapped_column(Integer, primary_key=True, comment='主鍵ID')
#    telephone: Mapped[str] = mapped_column(String(11), unique=True,comment="手機號碼")

自動建表:

def create_all_tables():
    Base.metadata.create_all(bind=engine)

# 由于main.py中的函數代碼都是同步的,所以下面的函數基本上用到。
async def async_create_all_tables():
    async with async_engine.begin() as conn:
        # 使用 run_sync 在異步上下文中執行同步操作
        await conn.run_sync(Base.metadata.create_all)

在main.py中使用:

from core import register_exception, database

def create_app():
    """啟動項目"""
 ...
    database.create_all_tables()

高級應用

由于我們創建的數據表大部分u都有created_at、id、updated_at字段,我們可以自定義基類:

# 定義一個公共模型
class BaseModel(Base):
    """
    公共 ORM 模型,基表
    """
    __abstract__ = True

    id: Mapped[int] = mapped_column(Integer, primary_key=True, comment='主鍵ID')
    created_at: Mapped[datetime] = mapped_column(
        DateTime, 
        default=func.now(), 
        comment='創建時間')
    updated_at: Mapped[datetime] = mapped_column(
        DateTime,
        default=func.now(),
        onupdate=func.now(),
        comment='更新時間'
    )
    deleted_at: Mapped[datetime] = mapped_column(
        DateTime, 
        nullable=True, 
        comment='刪除時間')

這樣上面的User模型就可以簡化為下面的方式,去掉了ID主鍵的定義:

# class User(BaseModel):
#     __tablename__ = 'users'
#    __table_args__ = ({'comment': '用戶表'})
#    telephone: Mapped[str] = mapped_column(String(11), unique=True,comment="手機號碼")

演示

在models下創建文件user.py,定義模型內容如下:

# models/user.py

from sqlalchemy import String
from sqlalchemy.orm import Mapped, mapped_column

from core.database import BaseModel, TableName
from passlib.context import CryptContext

pwd_context = CryptContext(schemes=['bcrypt'], deprecated='auto')
@TableName("users")
class User(BaseModel):
    telephone: Mapped[str] = mapped_column(String(11), index=True, unique=True, comment="手機號碼")
    password: Mapped[str] = mapped_column(String(128), comment="密碼")
    username: Mapped[str] = mapped_column(String(50), index=True, nullable=False, comment="姓名")

    @staticmethod
    def get_password_hash(password: str) -> str:
        """
        生成哈希密碼
        :param password: 原始密碼
        :return: 哈希密碼
        """
        return pwd_context.hash(password)

    @staticmethod
    def verify_password(password: str, hashed_password: str) -> bool:
        """
        驗證原始密碼是否與哈希密碼一致
        :param password: 原始密碼
        :param hashed_password: 哈希密碼
        :return:
        """
        return pwd_context.verify(password, hashed_password)

(1) 定義路由,實現增刪改查操作

打開數據庫連接工具比如navicat,然后創建數據庫zadmin 啟動服務。

(2) 異步操作

@app.get("/curd/async")
    asyncdef async_curd(
            db: AsyncSession = Depends(get_async_db),
    ):
        """創建用戶"""
        hashed_password = User.get_password_hash("123456")
        user = User(telephone="13800000090", password=hashed_password, username="admin")
        db.add(user)
        await db.commit()
        await db.refresh(user)
        print("add user {} {} {}".format(user.username, user.telephone, user.id))

        """根據ID獲取用戶"""
        result = await db.execute(select(User).where(User.id == 3))
        user = result.scalar()
        print(" scalar_one_or_none user {} {} {}".format(user.username, user.telephone, user.id))

        """獲取所有用戶(分頁)"""
        result = await db.execute(select(User).offset(0).limit(10))
        print(result.scalars().all())

        """更新用戶信息"""
        stmt = update(User).where(User.id == 1).values({"telephone":"13522023423"})
        result = await db.execute(stmt)
        print(result)

        result = await db.execute(select(User).where(User.telephone == "13522023423"))
        user = result.scalar_one_or_none()
        print(user)
        
        # 刪除操作
        stmt = delete(User).where(User.id == 3)
        result = await db.execute(stmt)
        await db.commit()

同步操作:

@app.get("/curd/sync")
    asyncdef sync_curd(
            db: Session = Depends(get_db),
    ):
        """同步創建用戶"""
        hashed_password = User.get_password_hash("123456")
        user = User(telephone="13800000090", password=hashed_password, username="admin")
        db.add(user)
        db.commit()
        db.refresh(user)
        print("add user {} {} {}".format(user.username, user.telephone, user.id))
        """單行查詢"""
        user = db.query(User).filter(User.id == 3).first()
        print("user by id  {} {} {}".format(user.username, user.telephone, user.id))
        """更新操作"""
        user = db.query(User).filter(User.id == 3).first()
        user.telephone = "13522023423"
        db.query(User).filter(User.id == 3).update({"telephone":"13522023423"})
        db.commit()
        db.refresh(user)

        user = db.query(User).filter(User.id == 1).first()
        db.delete(user)
        db.commit()


責任編輯:趙寧寧 來源: 程序員老朱
相關推薦

2025-09-08 06:10:00

FastAPI開發web

2025-09-08 11:00:00

2025-06-03 08:15:00

微服務架構異步任務隊列

2017-07-11 15:26:57

LocalMQ RocketMQ高性能

2023-11-06 08:32:17

FastAPIPython

2014-07-04 10:41:19

redis數據庫緩存

2025-05-20 07:00:37

2015-03-13 19:34:41

2019-07-23 11:41:45

數據庫SQLDocker

2018-06-01 14:00:00

數據庫MySQL分庫分表

2019-06-26 07:25:47

NoSQL數據庫開發

2023-12-18 11:21:40

MongoDB數據庫

2023-11-14 08:24:59

性能Scylla系統架構

2021-10-14 09:51:17

架構運維技術

2018-10-10 14:27:34

數據庫連接池MySQL

2013-06-19 09:20:53

Web開發Web性能優化高性能

2018-05-08 18:26:49

數據庫MySQL性能

2025-05-26 09:25:00

Web 接口開發Redis

2019-09-03 09:41:48

運維架構技術

2011-03-30 10:52:07

SQL Server數服務器
點贊
收藏

51CTO技術棧公眾號

一级全黄裸体片| 激情六月婷婷久久| 久久网这里都是精品| 中文字幕日韩av| 91在线|亚洲| 草草影院第一页| av中文字幕在线播放| 亚洲人成网77777色在线播放| 国产精品久久午夜| 538国产精品视频一区二区| av电影中文字幕| 在线看片福利| 不卡视频一二三| 国产精品久久久| 亚洲精品8mav| 精品在线播放视频| 亚洲综合小说区| 国产精品一区二区三区在线观| 一级特黄曰皮片视频| 亚洲欧洲www| 欧美亚洲视频一区二区| 法国伦理少妇愉情| 欧美大片91| 综合色中文字幕| 精品中文字幕人| 亚洲天堂日韩av| 99精品在线| 欧美日韩午夜在线视频| 日韩欧美视频一区二区| 成人免费短视频| 成人av资源电影网站| 亚洲成人精品在线观看| 欧美精品福利在线| 国产精品视频福利| 国产又粗又猛又爽又| 久久激情av| 国产成人3p视频免费观看| 亚洲国产日韩精品| 不卡中文字幕在线| 91麻豆成人精品国产| 郴州新闻综合频道在线直播| 日韩经典第一页| 欧美性大战久久久久xxx | 日韩精品诱惑一区?区三区| 日本乱人伦一区| 日韩福利二区| 色播色播色播色播色播在线| 久久综合狠狠| 最近2019年好看中文字幕视频| 天堂av8在线| 色av手机在线| 久久亚洲精品小早川怜子| 俄罗斯精品一区二区| 五月天综合激情| 国产亚洲欧美日韩在线观看一区二区| 欧美mv和日韩mv的网站| 精品久久久久久久久久中文字幕| 亚洲区小说区图片区| 视频在线观看国产精品| 欧美一区第一页| 六月丁香激情综合| 色男人天堂综合再现| 亚洲桃花岛网站| wwwxxx色| 成人高清一区| 性感美女极品91精品| 日本一区高清在线视频| 精品毛片在线观看| 久久亚洲二区| 国产精品va在线播放| 少妇无套内谢久久久久| 欧美精品综合| 中文字幕精品在线视频| 亚洲天堂精品一区| 九九热hot精品视频在线播放| 欧美成人一区二区三区片免费| 黄色一级视频片| 大片免费在线看视频| 亚洲天堂免费在线观看视频| 麻豆成人小视频| 亚洲经典一区二区三区| 奇米四色…亚洲| 午夜影院福利社| 精品人妻久久久久一区二区三区| 国产一区二区电影| 欧美一区在线直播| 丁香社区五月天| 国语自产精品视频在线看8查询8| 在线观看视频99| 日本丰满少妇裸体自慰| 蜜桃在线一区| 亚洲精品第一国产综合精品| 搡的我好爽在线观看免费视频| 在线日韩影院| 欧美在线免费观看视频| 亚洲午夜激情| 国产一级在线观看| 99久久久精品| 国产成人成网站在线播放青青 | 欧美一区二区三区性视频| 日韩免费毛片视频| 高潮在线视频| 亚洲国产精品影院| 欧美国产亚洲一区| 国产精品欧美一区二区三区不卡 | 国产精品乱码人人做人人爱| 99国产精品白浆在线观看免费| 麻豆视频在线观看免费| 国产精品视频一二三| 欧美性色黄大片人与善| 五月婷婷在线播放| 国产精品伦一区二区三级视频| 成年女人18级毛片毛片免费| 天天色天天射天天综合网| 日韩欧美福利视频| 免费观看日韩毛片| 欧美中文高清| 日韩欧美一区在线观看| 国产jk精品白丝av在线观看| 国产欧美日韩影院| 欧美劲爆第一页| 国产一区二区三区四区视频| 久久综合久久综合亚洲| 欧美黑人在线观看| 亚洲精品大全| 日韩欧美一级特黄在线播放| 亚洲熟女少妇一区二区| 亚洲一区二区三区无吗| 久久久精品在线| 国产探花在线免费观看| 欧美视频一区| 91精品一区二区| chinese偷拍一区二区三区| 国产精品麻豆视频| 中文字幕在线观看第三页| 精品久久久网| 日韩精品中文字幕在线一区| 亚洲av无一区二区三区| 日本伊人色综合网| 牛人盗摄一区二区三区视频| 91探花在线观看| 日韩欧美黄色动漫| 久久精品女同亚洲女同13| 免费成人av| 精品国偷自产在线视频99| 在线永久看片免费的视频| 99综合电影在线视频| 欧美视频在线观看视频| 91成人短视频| 亚洲午夜色婷婷在线| 很污很黄的网站| 美女视频黄a大片欧美| 99高清视频有精品视频| 欧美日韩在线精品一区二区三区激情综 | 亚洲国产精品成人综合| 欧美一级在线观看| 深爱五月激情网| 亚洲一区黄色| 性欧美xxxx| 免费精品一区二区| 中日韩av电影| 亚洲精品手机在线观看| 最新精品国产| 国产成人a亚洲精品| www.激情五月.com| 亚洲自拍偷拍九九九| 国产真人无码作爱视频免费| 一区二区日韩| 欧美激情第1页| 又污又黄的网站| 99久久伊人精品| 久久网站免费视频| 日韩国产欧美| 91精品国产99久久久久久红楼| 免费毛片在线| 欧美日精品一区视频| 日本中文在线视频| 日韩高清一区二区| 国产伦精品一区二区三区视频免费| 懂色av一区| 538在线一区二区精品国产| 国产精品亚洲无码| 怡红院精品视频在线观看极品| 国产日韩综合一区二区性色av| 天堂91在线| 亚洲福利一区二区| 大地资源二中文在线影视观看| 六月婷婷一区| 精品欧美日韩| jizz欧美| 午夜精品一区二区三区在线播放 | 国产精品亚洲欧美日韩一区在线| 欧美劲爆第一页| 91美女视频在线| 黑人欧美xxxx| avtt香蕉久久| 一本久道久久综合婷婷鲸鱼| 国产原创精品| 伊人网在线播放| 久久久精品一区二区三区| 天天操天天干天天舔| 亚洲一区二区三区中文字幕 | 最近更新的2019中文字幕| 国产ts人妖调教重口男| 亚洲欧洲日韩av| 自拍视频一区二区| 精东粉嫩av免费一区二区三区| 人妻夜夜添夜夜无码av| 精品国产乱子伦一区二区| 国产精品久久久久久久av电影 | 青青青手机在线视频观看| 91精品婷婷国产综合久久性色 | 蜜臀久久99精品久久久久久9| av 日韩 人妻 黑人 综合 无码| 久久亚洲精精品中文字幕| 4438全国亚洲精品在线观看视频| 91精选在线| 精品国产人成亚洲区| 日韩精品视频免费播放| a美女胸又www黄视频久久| 99re6在线观看| 日韩精品影视| 欧美精品七区| 久久资源综合| 豆国产97在线| 日韩一区网站| 成人国产精品日本在线| 成人在线app| 在线观看国产精品日韩av| 五月天婷婷在线播放| 日韩精品专区在线影院重磅| 99久久精品国产一区色 | 欧美日韩精品区| 亚洲一区二区三区在线播放| 亚洲天堂网av在线| 国产精品1区2区3区在线观看| 国产精品视频二| 91精品电影| 精品久久久久久中文字幕动漫| 欧美经典影片视频网站| 91精品国产自产在线老师啪| 99久久综合国产精品二区| 国产精品久久久久久久电影 | 在线观看免费视频综合| 国产精品视频久久久久久久| 亚洲高清久久久| 日韩精品成人在线| 欧美日韩国产页| av黄色在线播放| 日韩欧美精品在线观看| 最新中文字幕一区| 色狠狠一区二区三区香蕉| 久久国产视频一区| 最新热久久免费视频| 91传媒免费观看| 亚洲视频免费观看| 成人观看免费视频| 国产色91在线| 超碰人人cao| 成人黄页在线观看| bl动漫在线观看| 久久久久久免费网| wwwxxxx在线观看| 成人性生交大片免费看视频在线| 亚洲成色www.777999| 久久国内精品视频| 少妇性饥渴无码a区免费| 久久久久99| 做a视频在线观看| 国产69精品久久久久毛片| 另类小说第一页| 美女高潮久久久| 极品人妻一区二区| 99免费精品视频| 国产真人做爰视频免费| av在线不卡观看免费观看| 久久久亚洲av波多野结衣| 久久精品一级爱片| 亚洲一二三在线观看| 一区二区成人在线| 精品国产乱码一区二区| 欧美日韩视频在线第一区 | 无码人妻一区二区三区免费 | 国精产品乱码一区一区三区四区| 欧美三区免费完整视频在线观看| 国产女主播福利| 亚洲国产精品高清久久久| 99国产精品欲| 亚洲精品wwww| 香蕉视频国产在线观看| 亚洲日韩欧美视频一区| 久久日韩视频| 日韩有码在线播放| av在线播放网| 欧美美最猛性xxxxxx| 九色porny在线| 91av视频在线观看| 超级白嫩亚洲国产第一| 国产精品久久久久久久久粉嫩av| 无码国模国产在线观看| 欧美午夜欧美| 在线 亚洲欧美在线综合一区| 黄色三级视频在线| 成人黄色综合网站| 91嫩草丨国产丨精品| 日韩欧美成人区| 国产成人无码www免费视频播放| 在线观看久久av| 中文字幕资源网在线观看免费 | 68国产成人综合久久精品| 欧美日韩黄色一级片| 国产成+人+日韩+欧美+亚洲| 免费看黄色三级| 精品久久久久久久中文字幕 | 欧美黄色激情视频| 亚洲综合丁香婷婷六月香| 91丨porny丨在线中文| 亚洲欧美日韩视频一区| 欧洲免费在线视频| 欧美二区在线播放| 香蕉久久一区| 日产精品一线二线三线芒果| 99xxxx成人网| 丰满岳乱妇一区二区| 26uuu国产电影一区二区| 亚洲熟妇无码av| 午夜亚洲福利老司机| 国产免费视频一区二区三区| 一本色道久久综合亚洲精品小说| 五月天国产在线| 97久久人人超碰caoprom欧美| 欧美韩国日本在线观看| 久久亚洲a v| 精品综合免费视频观看| 91精品又粗又猛又爽| 一区二区三区在线免费视频 | 蜜桃视频网站在线| 国产精品igao视频| 国产精品亚洲人成在99www| 少妇高潮喷水在线观看| 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 亚洲一区二区三区高清视频| 中文国产成人精品| av成人在线播放| 在线观看一区二区三区三州| 亚洲午夜精品久久久久久app| 五月天婷婷在线观看视频| av不卡一区二区三区| 国产性xxxx高清| 日韩大陆欧美高清视频区| 美女搞黄视频在线观看| 国产精品午夜视频| 国产美女撒尿一区二区| 五月天久久狠狠| 欧美/亚洲一区| 中文字幕第10页| 亚洲成人在线免费| 五月婷婷六月色| 国产精品69久久| 久久人人88| 日本r级电影在线观看| 亚洲精品乱码久久久久久日本蜜臀| 国产欧美日韩成人| 欧美激情喷水视频| 久久精品国产亚洲5555| 国产免费成人在线| 国产女人18水真多18精品一级做| 久久久久成人网站| 欧美日韩一区二区在线观看| 黄网站视频在线观看| 国产高清精品一区| 国产精品美女久久久浪潮软件| 受虐m奴xxx在线观看| 欧美日韩国产天堂| 国模吧精品人体gogo| 国产精品一区二区三区久久| 欧美fxxxxxx另类| 在线天堂www在线国语对白| 日本精品免费观看高清观看| 麻豆免费在线视频| 精品欧美日韩在线| 精品一二三四区| 久久久久久久极品| 日日狠狠久久偷偷四色综合免费| 中文字幕一区二区三区四区久久| 久久美女福利视频| 自拍视频在线观看一区二区| 日本久久一级片| 欧美激情一区二区三区成人| 亚洲精品国产setv| 午夜精品免费看| 精品久久久久久电影| 一级毛片视频在线观看| 操人视频欧美| 日本不卡一区二区| 国产一级理论片| 精品久久久久久综合日本欧美| 中文不卡1区2区3区| 狠狠干视频网站| 国产美女在线精品|