2025 OEM 網站開發筆記 [98] - Django 連線 MySQL、資料遷移流程

apps 註冊、資料庫遷移、MySQL 資料表命名

Posted by Young on 2025-03-05
Estimated Reading Time 2 Minutes
Words 624 In Total

註冊 Django 應用程式(APP)

在專案中會將大部分功能模組化,每個模組稱為應用程式(APP)。

1
2
3
4
5
6
7
# api/products/apps.py
from django.apps import AppConfig

class ProductsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'api.products'
verbose_name = "產品管理" # 🔹 Django Admin 會顯示「產品管理」

settings 設定

settings.py 中註冊應用程式,Django 會自動尋找 apps.py 中的 ProductsConfig 類別,並用它來配置應用程式

1
2
3
4
5
INSTALLED_APPS = [
...
# 註冊 api(後端資料夾名稱) app
'api.products.apps.ProductsConfig',
]

並替換資料庫連線資訊

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Database
# https://docs.djangoproject.com/en/5.1/ref/settings/#databases

# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
# }

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'XXX',
'USER': 'XXX',
'PASSWORD': 'XXXXXXXXXX',
'HOST': '192.xxx.xxx.xxx',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
}
}
}

資料庫 migrate 流程

本專案使用的 MySQl 驅動為 pymysql

建立虛擬環境

本人習慣在各個不同專案目錄底下建立 venv,方便管理,並且不會互相干擾,只需格外注意要再 .gitignore 中加入 venv 別讓虛擬環境被版控即可

1
2
python -m venv venv
source venv/bin/activate

資料庫遷移

進入後端目錄開始進行資料遷移同步 Django 專案下 models.py 中的類別(Class)至資料庫

1
2
3
cd backend/
python manage.py makemigrations
python manage.py migrate

mysql_native_password 錯誤排除

若在遷移時遇到 "Authentication plugin 'mysql_native_password' cannot be loaded: 的錯誤訊息,是因為 MySQL 8+ 的身份驗證機制與 mysqlclient 兼容性問題,解決方法為在 backend/__init__.py 中加以下程式碼:

1
2
3
# __init__.py
import pymysql
pymysql.install_as_MySQLdb()

原因:Django 預設使用 MySQLdb,而這兩行能切換為 pymysql。避免對 Django 進行額外的設定變更,同時繞過 mysqlclient 的兼容性問題,不依賴 mysql_native_password.so

加入這兩行後在執行一次 python manage.py migrate 即可完成資料庫遷移

migrate_success

MySQL

Django 會使用 app_label_modelname 的格式來命名資料表,例如:

先前我把我所有的應用程式名稱「不再」設定為 api,而是依據它們不同的功能命名,例如 productorderuserblog 等等,這樣資料表更容易管理,那我將所有與 product 相關的資料表都放在 products 應用程式中

因此能看到在 MySQL 中資料表名稱從原本的 api_product、api_productimage、api_specification..

products_product、products_productimage、products_specification..等等。

mysql-table_name


若您覺得這篇文章對您有幫助,歡迎分享出去讓更多人看到⊂◉‿◉つ~


留言版