下班回到家,洗漱完畢,夜已深。關於Django這個系列的博文,我心中的想法就是承接之前的微信小程序的內容,做一個服務端的管理中心,上新菜單,調整價格啊!之類的,有點想法,才能完成一系列的學習,要不然漫無目的,也不知道堅持的意義。
上一篇,我們已經完成了第一個Django的app hello world,這篇我們的主題內容是連接MySql數據庫,因為工作當中使用的是MySql的數據庫,且我自己也有這個環境,那么就直接考慮使用MySql數據庫了。關於MySql服務的安裝,就不在這里描述了,咱們直奔主題。
1)修改配置時區與語言代碼,找到setting.py文件,修改里邊的語言代碼為:zh-Hans,修改時區為:Asia/Shanghai
# Internationalization # https://docs.djangoproject.com/en/2.1/topics/i18n/ LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = True
2)修改數據庫的配置, 官方文檔中提共了如下4種數據庫引擎,剩下的配置就是你的數據庫的連接信息,信息配置完成之后,一定要在MySql中新建數據庫DjangoLazyOrders
'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'
# Database # https://docs.djangoproject.com/en/2.1/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'DjangoLazyOrders', 'USER': 'test', 'PASSWORD': '123456', 'HOST': '127.0.0.1', 'PORT': '10080', } }
3)安裝pymysql,類似於.Net中使用的MySql.Data.dll,這么理解就行了。首先cmd切換到項目的虛擬環境下的Scripts文件夾下(D:\項目\local\DjangoLazyOrders\env\Scripts),然后輸入如下命令,回車,等待安裝完成,安裝完成后,我們能看到我們的安裝的版本為0.9.3,這是目前最新的版本。批注:一定要先切換到虛擬環境下再安裝
pip install pymysql
4)添加models,如下實體拷貝自官方文檔,其中__str__函數,類似於C#中重寫ToString()方法,添加完了模型之后,一定要將我們的app注冊到INSTALLED_APPS中,上一篇有提到。
from django.db import models # Create your models here. class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') def __str__(self): return self.question_text class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) def __str__(self): return self.choice_text
5)數據遷移,如下圖,選擇Django進行遷移,直接異常了ModuleNotFoundError: No module named 'MySQLdb'找不到MySQLdb這個模塊,要怎么解決這個問題呢?
打開__init__.py(hello)文件,將如下代碼貼進去,再次進行遷移,上一個問題解決了,但是馬上拋出了新的異常:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.配置要求使用1.3.13或者更新的版本,而你正在使用的是0.9.3的版本,要怎么解決這個問題呢?看錯誤提示中提到了一個文件D:\項目\local\DjangoLazyOrders\env\lib\site-packages\django\db\backends\mysql\base.py,打開這個文件,直接搜索1.3.13定位到代碼塊,注釋對版本校驗的代碼即可。
import pymysql pymysql.install_as_MySQLdb()
接下來再次嘗試進行遷移,WTF,再次異常:AttributeError: 'str' object has no attribute 'decode',沒辦法,只能再次根據提示找到D:\項目\local\DjangoLazyOrders\env\lib\site-packages\django\db\backends\mysql\operations.py文件,直接搜索errors='replace',定位到代碼塊,然后注釋掉下圖中的兩行代碼
再次嘗試進行遷移,終於沒有異常了,然后選擇遷移,終於,終於,成功了。
正在執行 manage.py makemigrations
No changes detected
正在執行 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, hello, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying hello.0001_initial... OK
Applying sessions.0001_initial... OK
>>>
然后我們去數據庫中查看,數據庫遷移成功,我們添加的實體,分別對應表hello_choice,hello_question
6)總結
- 該篇主要介紹了怎么在Django中配置連接MySql數據
- 完成了Code First的數據遷移
困了....待續....