四 Django-模型和數(shù)據(jù)庫基礎(chǔ)

一澜倦、簡介

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),連接方式有三種

  1. NAME褥芒,USER,PASSWORD椅文, HOST`喂很,PORT
  2. MySQL配置文件惜颇。
  3. OPTIONS
  1. 在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)',
      }
    }
    
  2. 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ù)庫端口號
        }
    }
    
  3. 其它
    # 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

  1. 核心代碼
    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
    
  2. 注意事項(xiàng)
    models.py必須命名成models否則數(shù)據(jù)遷移時(shí)檢測不到

2藤乙、數(shù)據(jù)庫遷移

  1. 說明
    這種方法可以在SQL等數(shù)據(jù)庫中創(chuàng)建與models.py代碼對應(yīng)的表猜揪,不需要自己手動執(zhí)行SQL。
    先 cd 進(jìn)入 manage.py 所在的那個(gè)文件夾下湾盒,輸入下面的命令
  2. 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
    
  3. 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)
    
  4. 執(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

  1. Oracle數(shù)據(jù)庫的服務(wù)名稱進(jìn)行連接,在setting文件中進(jìn)行如下配置
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.oracle',
            'NAME': '數(shù)據(jù)名',
            'USER': '用戶名',
            'PASSWORD': '密碼',
            'HOST': 'IP地址',
            'PORT': '端口',
        }
    }
    
  2. Threaded選項(xiàng)
    如果您打算在多線程環(huán)境中運(yùn)行Django(例如,在任何現(xiàn)代操作系統(tǒng)上使用默認(rèn)MPM模塊的Apache)俐载,則必須threadedOracle數(shù)據(jù)庫配置的選項(xiàng)設(shè)置為True:
    'OPTIONS': {
        'threaded': True,
    },
    
    但有可能導(dǎo)致一些意想不到的錯(cuò)誤

2蟹略、配置控制臺輸出sql

  1. 在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',
     },
     }
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遏佣,隨后出現(xiàn)的幾起案子挖炬,更是在濱河造成了極大的恐慌,老刑警劉巖状婶,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件意敛,死亡現(xiàn)場離奇詭異,居然都是意外死亡膛虫,警方通過查閱死者的電腦和手機(jī)草姻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稍刀,“玉大人撩独,你說我怎么就攤上這事〉衾觯” “怎么了跌榔?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捶障。 經(jīng)常有香客問我,道長纲刀,這世上最難降的妖魔是什么项炼? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮示绊,結(jié)果婚禮上锭部,老公的妹妹穿的比我還像新娘。我一直安慰自己面褐,他們只是感情好拌禾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著展哭,像睡著了一般湃窍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匪傍,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天您市,我揣著相機(jī)與錄音,去河邊找鬼役衡。 笑死茵休,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榕莺,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼俐芯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钉鸯?” 一聲冷哼從身側(cè)響起吧史,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亏拉,沒想到半個(gè)月后扣蜻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡及塘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年莽使,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笙僚。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芳肌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肋层,到底是詐尸還是另有隱情亿笤,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布栋猖,位于F島的核電站净薛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蒲拉。R本人自食惡果不足惜肃拜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雌团。 院中可真熱鬧燃领,春花似錦、人聲如沸锦援。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灵寺。三九已至曼库,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間替久,已是汗流浹背凉泄。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚯根,地道東北人后众。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓胀糜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒂誉。 傳聞我的和親對象是個(gè)殘疾皇子教藻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容