Django學習筆記(4)——Django連線MySQL資料庫
前言
在MVC或者MTV設計模式中,模型(M)代表對資料庫的操作。那麼如何操作資料庫呢?本小節就認真學習一下。首先複習一下Django的整個實現流程 ,然後再實現一下使用資料庫的整個流程,最後學習一下連線資料庫需要了解的知識。
其實之前已經有學習過,可以參考部落格: Django學習筆記:初始Django
但是這裡想詳細的進行學習,對Django 一些基本的知識點進行了解。
1,Django的流程實現
django #安裝: pip3 install django 新增環境變數 #1建立project django-admin startproject mysite ---mysite ---settings.py ---url.py ---wsgi.py ---- manage.py(啟動檔案) #2建立APP python mannage.py startappapp01 #3settings配置 TEMPLATES STATICFILES_DIRS=( os.path.join(BASE_DIR,"statics"), ) STATIC_URL = '/static/' #我們只能用 STATIC_URL,但STATIC_URL會按著你的STATICFILES_DIRS去找 #4根據需求設計程式碼 url.py view.py #5使用模版 render(req,"index.html") #6啟動專案 python manage.py runserver127.0.0.1:8090 #7連線資料庫,操作資料 model.py
2,程式碼填充
根據需求,我們先完成主程式(也就是mysite/urls.py)的內容:
from mysql01 import views # admin 後臺的路由,先註釋掉 urlpatterns = [ path('admin/', admin.site.urls), # 你的路由,重點是引號中的正則表示式和後面的業務邏輯函式 path('index/',views.index), # url(r'index/',views.index), ]
注意:關於django.urls path 和django.conf.urls url 的區別, django中 url 和 path 都是配置路徑,有什麼不同呢?
path 和 url 是兩個不同的模組,效果都是響應返回頁面,path呼叫的是python第三方模組或者框架,而url則是自定義的模組。
當然,主要問題在於版本: 1.x版本用url 2.x 版本用path
再填充我們APP的views
from django.shortcuts import render # Create your views here. def index(req): return render(req,'index.html')
完成自己寫的index.html檔案(隨便寫的,內容如下)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> <h1 style='background-color: antiquewhite;color:black;'>hello world</h1> <h1>使用者輸入</h1> <form action="/index/" method="post"> <input type="text" name="username"> <input type="password" name="password"> <input type="submit" value="提交"> </form> </body> </html>
當你寫入一個HTML檔案在templates中,為了讓Django知道我們的HTML檔案在哪裡,需要修改settings檔案的相應內容,但是預設情況下,他正好使用,無需修改,除非特殊情況。
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # 要是有這一行,如果已經存在請保持原樣 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
3,執行程式
直接輸出下面程式碼即可執行Django:
python manage.pyrunserver
在瀏覽器輸入下面程式碼即可顯示index.html內容:
127.0.0.1:8000/index
一,使用Django自帶的sqlite3資料庫
Django通過自帶的ORM框架可以操作資料庫,並且自帶輕量級的sqlite3資料庫,Django預設使用SQLite資料庫,因為Python源生支援SQLite資料庫,所以我們無需安裝任何程式,就可以直接使用,下面我們先練習一下。
1.1 在settings中,配置資料庫相關引數
因為是自帶的sqlite,所以無需修改,這裡我們看一下:
# Database # https://docs.djangoproject.com/en/2.1/ref/settings/#databases DATABASES = { 'default': { # 這裡可以指定使用的資料庫型別,例如mysql 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
1.2 編譯models.py
Django通過自定義python類的形式來定義具體的模型,每個模型的物理存在方式就是一個python的Class,每個模型代表資料庫中的一張表,每個類的例項代表資料庫中的一行資料,類中的每個變數代表資料庫中的一列欄位。
Django通過模型,將python程式碼和資料庫操作結合起來,實現對SQL查詢語言的封裝。也就是說,你可以不會管理資料庫,可以不會SQL語言,你同樣能通過python的程式碼進行資料庫的操作。DJango通過ORM對資料庫進行操作,下面直接看程式碼:
from django.db import models # Create your models here. class UserInfo(models.Model): ''' 建立兩個欄位,最大長度是32,型別是char ''' user = models.CharField(max_length= 32) pwd = models.CharField(max_length= 32)
這裡我們建立了兩個欄位,分別儲存使用者的名稱和木馬
1.3 在終端建立表
我們需要在pycharm的teminal中通過命令建立資料庫的表,有兩條命令,分別是:
生成同步資料庫的指令碼程式碼
python manage.py makemigrations
通過執行makemigrations 命令,相當於告訴Django,你對模型有改動,並且你想把這些改動儲存為一個“遷移”(migration)。
執行後,結果如下:
Migrations for 'mysql01': mysql01\migrations\0001_initial.py - Create model UserInfo
migrations是Django儲存模型修改記錄的檔案,這些檔案儲存在磁碟上,從上面可以看到,它就是 mysql01\migrations\0001_initial.py 。我們可以開啟這個檔案看一下,裡面儲存的都是可讀並且可編譯的內容,方便我們隨時手動修改。
下面看一下0001_initial.py內容:
# Generated by Django 2.1.7 on 2019-03-12 01:45 from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='UserInfo', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('user', models.CharField(max_length=32)), ('pwd', models.CharField(max_length=32)), ], ), ]
同步資料庫(也就是對資料庫執行真正的遷移動作)指令碼程式碼
python manage.py migrate
migrate命令對所有還未實施的遷移記錄進行操作,本質上就是將你對模型的修改體現到資料庫中具體的表上面。Django通過一張叫做django_migrations的表,記錄並跟蹤已經實施的migrate動作,通過對比獲得哪些migrations尚未提交。
執行後,結果如下:
Operations to perform: Apply all migrations: admin, auth, contenttypes, mysql01, sessions Running migrations: Applying mysql01.0001_initial... OK
注意:在開發過程中,資料庫同步誤操作之後,難免會遇到後面不能同步成功的情況,解決這個問題的一個簡單粗暴方法是把migrations目錄下的指令碼(除__init__.py之外)全部刪掉,再把資料庫刪掉之後建立一個新的資料庫,資料庫同步操作再重新做一遍。
所以我們需要為進入這個專案的後臺建立超級管理員:
python manage.py createsuperuser
設定好使用者名稱和密碼後便可登入啦!
二,使用MySQL資料庫
下面學習MySQL資料庫連線Django。
1,開啟MySQL命令對話方塊,建立表
create database djangomysql default charset=utf8;
在使用非SQLite的資料庫時候,請務必預先在資料庫管理系統的提示符互動模式下建立資料庫,我們可以使用命令:“CREATE DATABASE database_name;”。Django不會自動幫你做這一步工作。
2,建立一個APP
python manage.py startapp mysql02
3,修改Django中settings.py的相關引數,配置MySQL
新增mysql02這個APP
INSTALLED_APPS = [ 'django.contrib.admin',#admin後臺管理站點 'django.contrib.auth',# 身份認證系統 'django.contrib.contenttypes', # 內容型別框架 'django.contrib.sessions', # 回話框架 'django.contrib.messages',# 訊息框架 'django.contrib.staticfiles', # 靜態檔案管理框架 'mysql02', ]
註釋SQLite,配置MySQL
DATABASES = { 'default': { # 這裡可以指定使用的資料庫型別,例如mysql 'ENGINE': 'django.db.backends.mysql', 'NAME': 'djangomysql', 'USER':'root', 'PASSWORD':'******', 'HOST':'localhost', 'PORT':'3306', } }
或者這樣寫:
# mysite/settings.py # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases import pymysql# 一定要新增這兩行!通過pip install pymysql! pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mysite', 'HOST': '192.168.1.1', 'USER': 'root', 'PASSWORD': 'pwd', 'PORT': '3306', } }
4,安裝MySQL-python
必須先按照MySQLdb,不然會報如下的錯誤:
ModuleNotFoundError: No module named 'MySQLdb'
Django連線mysql預設驅動是MySQLdb,MySQLdb沒有支援python3的版本,如果使用python3.x版本的時候,Django連線mysql的方法是使用pymysql替換MySQLdb。
在配置檔案同目錄下的__init__.py檔案中加入以下程式碼(本文就是mysite下的__init__.py):
import pymysql pymysql.install_as_MySQLdb()
使用myslqclient代替MySQLdb,mysqlclient專案在github上的地址為 https://github.com/PyMySQL/mysqlclient-python,該專案fork MySQLdb,加入了對python3的支援。
安裝如下:
pip install pymysql
沒有提示MySQLdb模組找不到,說明按照OK。
5,編譯models.py
Django通過自定義python類的形式定義具體的模型,每個模型代表資料庫中的一張表,每個類的例項代表資料表中的一行資料,類中的每個變數代表資料表中的一列欄位。
from django.db import models # Create your models here. class Userinfo(models.Model): ''' 建立兩個欄位,最大長度為32,型別是char ''' user = models.CharField(max_length= 32) pwd = models.CharField(max_length= 32)
6,在終端建立資料庫的表
我們需要先生成同步資料庫的指令碼程式碼:
python manage.py makemigrations
執行結果如下:
Migrations for 'mysql02': mysql02\migrations\0001_initial.py - Create model Userinfo
然後同步資料庫(也就是對資料庫執行真正的遷移動作)
python manage.py migrate
執行結果如下:
Operations to perform: Apply all migrations: admin, auth, contenttypes, 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 sessions.0001_initial... OK
7,檢視mysql資料庫
在MySQL中,進入建立的庫中,檢視我們在Django建立的表:
三,在pycharm上操作MySQL
pycharm可以建立,讀寫資料庫,不過如果想與工程相連,還是需要在工程中用程式碼連結,單擊Database側邊欄位。新增Database,如下圖:
點選“+”,然後點選Data Sources,進入設定介面。如下:
然後填寫連線資訊,Database欄可以填寫具體資料庫名稱,不填寫則載入所有資料庫。第一次使用PyCharm時會提示設定操作木馬,填寫完成後可以點選“Test Connection”,測試連線情況,沒有問題,點選OK,輸入操作木馬即可完成連線。
注意:這裡必須注意下載missing dirver files。
右側為MySQL目錄,如果修改,檢視沒有找到自己的資料庫,點選“more schemes”,如圖:
可以在命令列直接操作資料庫,如圖:
結果如下:
雙擊table1,可以圖形化顯示資料表:
顯示結果如下:
四,python操作MySQL
在Python環境下的操作,我們必然是通過寫Python程式碼的方式。但是Python和資料庫語言SQL是兩碼事,它根本無法操作資料庫,沒關係,我們可以在Python程式碼中嵌入SQL語句,比如下面的方式:
# 建立連線,這裡先忽略建立方法 conn = ...... # 建立遊標 cursor = conn.cursor() # 執行SQL,並返回收影響行數 effect_row = cursor.execute("insert into host (hostname,port,ip) values('ubuntu','22','10.0.0.2');") # 提交,不然無法儲存新建或者修改的資料 conn.commit() # 關閉遊標 cursor.close() # 關閉連線 conn.close()
所以問題來了,python如何建立和資料庫的連結呢?這裡我們使用pymysql這一類的第三方模組(針對不同的資料庫,有不同的模組),於是我們有下面的連結:
conn = pymysql.connect(host='137.78.5.130', port=3306, user='root', passwd='123456', db='test')
大多數程式設計師不是專業的DBA,所以SQL寫的很爛也正常,那麼出錯問題如何解決呢?
Python語法可以解決這個問題,我們使用Python語法來寫,然後使用一箇中間工具將Python程式碼翻譯成原生的SQL語句,而這個中間工具就是所謂的ORM(物件關係對映)!
ORM將一個Python的物件對映為資料庫中的一張關係表。它將SQL封裝起來,程式設計師不再需要關心資料庫的具體操作,只需要專注於自己本身的程式碼和業務邏輯的實現。
於是整體的流程就是:Python程式碼,通過ORM轉換成SQL語句,再通過pymysql去實際操作資料庫。
Django自帶ORM系統,不需要額外的安裝別的ORM。當然也可以安裝並使用其他的ORM,比如SQLAlchemy。但是不建議這麼做,因為Django系統龐大,整合完善,模型層與檢視層,模板層結合的比較緊密。
五,其他django命令列操作命令
1,清空資料庫
python manage.pyflush
2,查詢某個命令的詳細資訊
django-admin.pyhelpstartapp
admin 是Django 自帶的一個後臺資料庫管理系統。
此時會進入django-admin的內容區:
#!c:\programdata\anaconda3\python.exe from django.core import management if __name__ == "__main__": management.execute_from_command_line()
3,啟動互動介面
python manage.pyshell
這個命令和直接執行 python 進入 shell 的區別是:你可以在這個 shell 裡面呼叫當前專案的 models.py 中的 API,對於操作資料,還有一些小測試非常方便。
4,忘記命令時,可以這樣操作
終端上輸入python manage.py 可以看到詳細的列表,在忘記子名稱的時候特別有用 。
Type 'manage.py help <subcommand>' for help on a specific subcommand. Available subcommands: [auth] changepassword createsuperuser [contenttypes] remove_stale_contenttypes [django] check compilemessages createcachetable dbshell diffsettings dumpdata flush inspectdb loaddata makemessages makemigrations migrate sendtestemail shell showmigrations sqlflush sqlmigrate sqlsequencereset squashmigrations startapp startproject test testserver [sessions] clearsessions [staticfiles] collectstatic findstatic runserver
5,修改語言
在主程式的settings.py裡面查詢語言編碼,預設是英文的,這裡可以修改為中文,此處修改針對的是admin的頁面。
LANGUAGE_CODE = 'en-us'# 預設 LANGUAGE_CODE = 'zh-hans'# 改為中文,主要針對admin頁面
6,配置模板路徑
在專案根目錄下新增templates資料夾。
TEMPLATE_DIRS = ( os.path.join(BASE_DIR,'templates'), ) #然後在專案根目錄下新增templates資料夾