[Python] Django連接現有MySQL資料庫

鼠年全馬鐵人挑戰 - WEEK 01

前言

Django預設的資料庫使用sqlite3,本篇紀錄如何從預設的sqlite3改完連接MySQL中現有的資料庫,本篇也作為今年參加鼠年全馬鐵人挑戰的開篇 XD

安裝

我是在虛擬環境下安裝,使用pipenv做套件管理。

安裝pymysql

1
pipenv install pymysql

安裝django

1
pipenv install django

建立專案

建立名為mysite的專案名稱

1
django-admin startproject mysite

建立名為exrate的APP

1
python manage.py startapp exrate

相關設定

設定__init__.py

至專案根目錄(mysite)下的__init__.py檔,添加下方兩行程式碼:

1
2
import pymysql
pymysql.install_as_MySQLdb()

設定database

至專案根目錄(mysite)下的settings.py檔,替換成下方程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DATABASES = {
'default': {
# ========= 將預設的sqlite3 ENGINE 還有 NAME 註解掉 =========
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

# ========= 配置自己的MySQL =========
'ENGINE': 'django.db.backends.mysql',
'NAME': 'exrate', # 目標資料庫的名稱
'USER': 'your account', # 資料庫帳號
'PASSWORD': 'your password', # 資料庫密碼
'HOST': 'localhost', # 主機位置,可以先測本地localhost
'PORT': '8889', # 設定連接埠
}
}

連接

連接已有的資料庫與Django app

1
python manage.py inspectdb

可能會遇到的問題: 版本問題

執行上個連接步驟的指令時,可能會遇到以下錯誤:

解決方法

上方圖片中的錯誤訊息有提示問題發生在哪個檔案,打開提示路徑下的目標檔案base.py,檔案內尋找version = Database.version_info的程式碼,會看到下方程式碼:

1
2
3
version = Database.version_info
if version < (1, 3, 13):
raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

上述程式碼改成

1
2
3
4
version = Database.version_info
if version < (1, 3, 13):
pass
#raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

更改後存檔,在執行一次連接MySQL資料庫的指令

1
python manage.py inspectdb

執行結果

引用inspectdb套件建立模型

第一種方法

複製執行後所看到的程式碼內容貼到建立的app專案資料夾中的models.py

第二種方法

將下方指令中的myapp替換成自己建立的app專案名稱並執行

1
python manage.py inspectdb > myapp/models.py 

建立migrations資料表

myapp替換成自己建立的app專案名

1
python manage.py makemigrations myapp

migrate同步資料表

myapp替換成自己建立的app專案名

1
python manage.py migrate myapp

完成遷移!

參考資料

官方文件-舊有資料庫遷移

Comments