iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
Modern Web

FastAPI 入門30天系列 第 8

Day-8 簡易庫存系統-DB設計 

  • 分享至 

  • xImage
  •  

我們透過這個簡易庫存系統的案例,帶大家建置一個簡單的FastAPI專案。

下圖為此系統的資料庫規劃 :

https://ithelp.ithome.com.tw/upload/images/20230913/20152669xg8aRiYEfs.png

我們會使用到3個表,顧客、訂單、產品三張表。

我們會根據這三張表來用FastAPI實作一些商業邏輯的操作,那當然目前的規劃都只是暫時性的,會根據實際上的需求而新增修改欄位,目前先讓大家有個概念即可。

ORM ( Object Relational Mapping )

在使用 FastAPI 進行應用程式建置時,我們通常會使用 ORM 與 DB 進行溝通。

ORM是一種可以將物件和資料庫進行對應的技術,可以理解成說程式與DB中間多了一層翻譯人員,ORM會將程式碼轉換成SQL語言再去DB進行查詢。

https://ithelp.ithome.com.tw/upload/images/20230913/201526698A3LQr3cte.jpg

轉自 ORM 的核心概念:它不是SQL的替代品,也不可能替代SQL | 小朱® 的技術隨手寫 - 點部落 (dotblogs.com.tw)

使用ORM進行資料庫操作時可以不用擔心 SQL injection 的攻擊,也能使遷移資料庫時更加方便,不用擔心各個資料庫的語法差異。

但也不是說只學ORM技術便不用學SQL語言了,再一些複雜的查詢情況下,使用原生SQL進行查詢的效益會遠大於使用ORM。

更別說如果SQL語言不熟練,後續該如何去優化你的查詢效能呢?

SQLAlchemy

SQLAlchemy 是一個 Python的開源ORM套件,我們在使用 FastAPI 時可以搭配此套件與 DB 進行溝通操作。

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
 
class Movie(Base):
    __tablename__ = 'movies'
 
    id = Column(Integer, primary_key=True)
    title = Column(String(255), nullable=False)
    year = Column(Integer)
    directed_by = Column(Integer, ForeignKey('directors.id'))

我們可以透過這種形式的定義,來完成資料表的對應,若是從DB獲取查詢資料回來時,便會是這種類型的物件。

Alembic

Alembic 是搭配 SQLAlchemy 使用的資料庫遷移工具,使用 Alembic 就可以將上一小節範例中定義的物件,轉換成如下範例的資料庫遷移檔:

"""create account table

Revision ID: 1975ea83b712
Revises:
Create Date: 2011-11-08 11:40:27.089406

"""

# revision identifiers, used by Alembic.
revision = '1975ea83b712'
down_revision = None
branch_labels = None

from alembic import op
import sqlalchemy as sa

def upgrade():
    op.create_table(
        'account',
        sa.Column('id', sa.Integer, primary_key=True),
        sa.Column('name', sa.String(50), nullable=False),
        sa.Column('description', sa.Unicode(200)),
    )

def downgrade():
    op.drop_table('account')

製作完遷移檔之後,便可以使用 Alembic 將遷移檔內對資料庫的更動同步到目標資料庫中,也可以降低版本回到上一個遷移檔的狀態,以實現資料庫的版本管理。

小結

在下一章節,我們將會使用 SQLAlchemy 定義好資料庫物件,在使用 Alembic 建立遷移檔並同步到目標資料庫中。

參考資料

ORM 的核心概念:它不是SQL的替代品,也不可能替代SQL | 小朱® 的技術隨手寫 - 點部落 (dotblogs.com.tw)


上一篇
Day-7 清晰的專案架構
下一篇
Day-9 簡易庫存系統 - 資料庫設定
系列文
FastAPI 入門30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言