Django配置mysql
- 安裝mysqlclient[版本 mysqlclient 1.3.13以上,官網目前爲1.4.x ]
sudo pip3 install mysqlclient
創建數據庫
- 進入mysql數據庫執行
- create database 數據庫名 default charset utf8
- 通常數據庫名跟項目名保持一致
- settings.py 裏進行數據庫的配置
- 修改DATABASES配置項的內容,由sqlite3變爲mysql
創建好後如果報錯:
NameError: name '_mysql' is not defined
需在項目的_init_.py文件下加
import pymysql
pymysql.install_as_MySQLdb()
重新執行後如果報錯
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required; you have 0.10.1.
有一個好辦法,直接指定版本,比其他的解決方法簡單一些…
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()
什麼是模型
- 模型是一個python類,它是由django.db.models.Model派生出的子類。
- 一個模型類代表數據庫中的一張數據表
- 模型類中每一個類屬性都代表數據庫中的一個字段
- 模型是數據交互的接口,是代表和操作數據庫的方法和方式
ORM框架
- 定義:ORM(Object Relational Mapping)即對象關係映射,它是一種程序技術,它允許你使用類和對象對數據庫進行操作,從而避免通過SQL語句操作數據庫
- 作用:
- 建立模型類和表之間的對應關係,允許我們通過面向對象的方式來操作數據庫。
- 根據設計的模型類生成數據庫中的表格
- 通過簡單的配置就可以進行數據庫的切換
- 優點
- 只需要面向對象編程,不需要面向數據庫編寫代碼。
對數據庫的操作都轉化爲對類屬性和方法的操作
不用編寫各種數據庫的sql語句 - 實現了數據模型與數據庫的解耦,屏蔽了不同數據庫操作上的差異
不再關注用的是mysql,oracle...等數據庫的內部細節
通過簡單的配置就可以輕鬆更換數據庫,而不需要修改代碼
- 只需要面向對象編程,不需要面向數據庫編寫代碼。
- 缺點
- 對於複雜業務,使用成本較高
- 根據對象的操作轉換成SQL語句,根據查詢的結果轉換成對象,在映射過程中有性能損失
模型類代碼示例
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField("書名",max_length=50,default='')
price = models.DecimalField('價格',max_digits=7,decimal_places=2,default=0.0)
數據庫遷移
- 遷移是Django同步您對模型所做更改(添加字段,刪除模型等)到您的數據庫模式的方法
- 生成遷移文件 - 執行 python3 manage.py makemigrations
將應用下的models.py文件生成一箇中間文件,並保存在migrations文件夾中 - 執行遷移腳本程序 - 執行 python3 manage.py migrate
執行遷移程序實現遷移。將每個應用下的migrations目錄中的中間文件同步回數據庫
- 生成遷移文件 - 執行 python3 manage.py makemigrations
實操:
^CliujiadeMacBook-Pro:mysite1 liujia$ python3 manage.py startapp bookstore
liujiadeMacBook-Pro:mysite1 liujia$ python3 manage.py makemigrations
Migrations for 'bookstore':
bookstore/migrations/0001_initial.py
- Create model Book
liujiadeMacBook-Pro:mysite1 liujia$ python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, bookstore, 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 auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying bookstore.0001_initial... OK
Applying sessions.0001_initial... OK
liujiadeMacBook-Pro:mysite1 liujia$
mysql> use mysite1
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> show tables;
+----------------------------+
| Tables_in_mysite1 |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| bookstore_book |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
11 rows in set (0.00 sec)
mysql> desc bookstore_book;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | bigint | NO | PRI | NULL | auto_increment |
| title | varchar(50) | NO | | NULL | |
| price | decimal(7,2) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)
mysql>