一澜倦、簡介
Django 模型是與數(shù)據(jù)庫相關(guān)的贬墩,與數(shù)據(jù)庫相關(guān)的代碼一般寫在 models.py 中榴嗅,Django 支持 sqlite3, MySQL, PostgreSQL,oracle等數(shù)據(jù)庫,只需要在settings.py中配置即可陶舞,不用更改models.py中的代碼,豐富的API極大的方便了使用绪励。
二肿孵、模型
模型是你數(shù)據(jù)的唯一的、確定的信息源疏魏。 它包含你所儲存數(shù)據(jù)的必要字段和行為停做。 通常,每個(gè)模型對應(yīng)數(shù)據(jù)庫中唯一的一張表
三大莫、前期準(zhǔn)備工作
1蛉腌、django對支持MySQL有三個(gè)主要的驅(qū)動程序
- MySQLdb是Andy Dustman十多年來開發(fā)和支持的本地驅(qū)動程序,Django需要MySQLdb 1.2.3或更高版本。MySQLdb(1.2.5)的最新版本不支持Python 3,為了在Python 3下使用MySQLdb,需要安裝mysqlclient
- mysqlclient是一個(gè)
MySQLdb
特別支持Python 3 的分支只厘,可以用作MySQLdb的插入替代品- MySQLconnector/ Python這個(gè)是純python實(shí)現(xiàn)的MySQL接口烙丛,由Oracle維護(hù)(官方驅(qū)動)
- pymysql
所有這些驅(qū)動程序都是線程安全的,并提供連接池羔味。
MySQLdb
是目前唯一不支持Python 3的河咽。除了DB API驅(qū)動程序之外,Django還需要一個(gè)適配器才能從ORM訪問數(shù)據(jù)庫驅(qū)動程序赋元。Django為MySQLdb / mysqlclient提供了一個(gè)適配器忘蟹,而MySQL Connector/Python包含它自己的。
2搁凸、下載驅(qū)動
sudo pip install pymysql
需要導(dǎo)入到django中媚值,打開應(yīng)用下/
__init__.py
文件import pymysql
pymysql.install_as_MySQLdb() # 與mysql交互的函數(shù)
3、創(chuàng)建數(shù)據(jù)庫
指定編碼和排序規(guī)則
CREATE DATABASE IF NOT EXISTS **yourdbname **DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
4护糖、連接數(shù)據(jù)庫
在settings.py中配置mysql連接參數(shù)(沒有mysql的先裝mysql),連接方式有三種
- NAME褥芒,USER,PASSWORD椅文, HOST`喂很,PORT
- MySQL配置文件惜颇。
- OPTIONS
- 在settings.py中通用配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '數(shù)據(jù)庫名', 'USER':'mysql用戶名(如root)', 'PASSWORD':'密碼(root)', 'HOST':'域名(127.0.0.1或localhost)', 'PORT':'端口號(3306)', } }
- MySQL配置文件
# settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #django.db.backends.postgresql # PostgreSQL #django.db.backends.sqlite3 # sqlite #django.db.backends.oracle # oracle 'OPTIONS': { 'read_default_file': '配置文件路徑/xxx.cnf', }, } } #xxx.cnf [client] database = django user = root password = root host = 127.0.0.1 port = 3306 default-character-set = utf8
#config.ini [global] ip = xxx port = xxx table = xxx uname = xxx passwd = xxx #讀取本地配置文件用了個(gè)django自帶的模塊:configparser #在settings.py 中設(shè)置如下,按照相對路徑取本地配置文件: import configparser import os dir_now = os.path.dirname(os.path.dirname(os.path.abspath("settings.py"))) # 路徑自己指定少辣,我這里是以settings.py為參考凌摄,abspath是取它的上級目錄,也可以直接指定絕對路徑來讀取 conf = configparser.ConfigParser() conf.read(dir_now+'/config.ini') # 讀config.ini文件 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 使用mysql這樣寫就行了漓帅,是指明引擎的 'NAME': conf.get('global', 'table'), # 庫名 'USER': conf.get('global', 'uname'), # 用戶名 'PASSWORD': conf.get('global', 'passwd'), # 密碼 'HOST': conf.get('global', 'ip'), # 數(shù)據(jù)庫主機(jī)ip 'PORT': conf.get('global', 'port'), # 數(shù)據(jù)庫端口號 } }
- 其它
# MySQL數(shù)據(jù)庫配置項(xiàng) MYSQL_OPTIONS = { # 使用嚴(yán)格模式TRADITIONAL插入數(shù)據(jù) 'sql_mode': 'TRADITIONAL', 'charset': 'utf8', 'init_command': """ # 設(shè)置默認(rèn)的數(shù)據(jù)庫引擎 SET default_storage_engine=INNODB; # 設(shè)置連接的編碼集 默認(rèn)的排序方式 SET character_set_connection=utf8,collation_connection=utf8_unicode_ci; # 設(shè)置數(shù)據(jù)庫的事務(wù)級別 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; """ } DATABASES = { 'default': { ... 'OPTIONS': MYSQL_OPTIONS, # 設(shè)置數(shù)據(jù)庫交互方式為事務(wù) 'ATOMIC_REQUESTS': True, } ANSI模式:寬松模式锨亏,對插入數(shù)據(jù)進(jìn)行校驗(yàn),如果不符合定義類型或長度忙干,對數(shù)據(jù)類型調(diào)整或截?cái)啾4嫫饔瑁瑘?bào)warning警告。 TRADITIONAL模式:嚴(yán)格模式捐迫,當(dāng)向mysql數(shù)據(jù)庫插入數(shù)據(jù)時(shí)乾翔,進(jìn)行數(shù)據(jù)的嚴(yán)格校驗(yàn),保證錯(cuò)誤數(shù)據(jù)不能插入施戴,報(bào)error錯(cuò)誤反浓。用于事物時(shí),會進(jìn)行事物的回滾赞哗。 STRICT_TRANS_TABLES模式:嚴(yán)格模式雷则,進(jìn)行數(shù)據(jù)的嚴(yán)格校驗(yàn),錯(cuò)誤數(shù)據(jù)不能插入肪笋,報(bào)error錯(cuò)誤
四月劈、數(shù)據(jù)遷移
1、編寫models.py
- 核心代碼
from django.db import models class Person(models.Model): SEX_CHOICES = ( ('1', '男'), ('2', '女'), ) pid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() sex = models.CharField(max_length=2, choices=SEX_CHOICES) register_date = models.DateField(auto_now_add=True) class Mate: verbose_name = '人員信息' verbose_name_plural = verbose_name def __str__(self): return self.name
-
注意事項(xiàng)
models.py必須命名成models否則數(shù)據(jù)遷移時(shí)檢測不到
2藤乙、數(shù)據(jù)庫遷移
- 說明
這種方法可以在SQL等數(shù)據(jù)庫中創(chuàng)建與models.py代碼對應(yīng)的表猜揪,不需要自己手動執(zhí)行SQL。
先 cd 進(jìn)入 manage.py 所在的那個(gè)文件夾下湾盒,輸入下面的命令 - Django 1.6.x 及以下
#1.7版本之前湿右,Django只支持新增模型到數(shù)據(jù)庫中;通過syncdb(migrate的前身)命令變更或者刪除現(xiàn)存的模型市不可能的罚勾。 #第三方工具毅人,尤其是South,支持這些增加的變更類型尖殃,但是現(xiàn)在被認(rèn)為已經(jīng)足夠重要到需要引入到django的core中去 python manage.py syncdb
- Django 1.7 及以上的版本需要用以下命令
#用來根據(jù)你對模型做的變更創(chuàng)建新的遷移腳本 python manage.py makemigrations <app_name>(可選,指定模塊,默認(rèn)整個(gè)項(xiàng)目下的app) #用來使遷移生效丈莺,以及未生效時(shí)報(bào)告它們的狀態(tài)。 python manage.py migrate <app_name>(可選,指定模塊,默認(rèn)整個(gè)項(xiàng)目下的app)
- 執(zhí)行migrate命令后相當(dāng)于如下sql語句
#默認(rèn)表名(包名+類名) CREATE TABLE `test_person` ( `pid` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL, `age` int(11) NOT NULL, `sex` varchar(2) NOT NULL, `register_date` date NOT NULL, PRIMARY KEY (`pid`) )
3送丰、通過表生成model
python manage.py inspectdb > app/models.py
五缔俄、其它數(shù)據(jù)庫連接
1、oracle
- Oracle數(shù)據(jù)庫的服務(wù)名稱進(jìn)行連接,在setting文件中進(jìn)行如下配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.oracle', 'NAME': '數(shù)據(jù)名', 'USER': '用戶名', 'PASSWORD': '密碼', 'HOST': 'IP地址', 'PORT': '端口', } }
- Threaded選項(xiàng)
如果您打算在多線程環(huán)境中運(yùn)行Django(例如,在任何現(xiàn)代操作系統(tǒng)上使用默認(rèn)MPM模塊的Apache)俐载,則必須將threaded
Oracle數(shù)據(jù)庫配置的選項(xiàng)設(shè)置為True:
但有可能導(dǎo)致一些意想不到的錯(cuò)誤'OPTIONS': { 'threaded': True, },
2蟹略、配置控制臺輸出sql
- 在settings.py文件中
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }