海上月明

          editer by sun
          posts - 162, comments - 51, trackbacks - 0, articles - 8
             :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

          From:http://www.czug.org/python/django/17.html

          盡管Django最適合從零開始開發(fā)項目--所謂的"綠色領(lǐng)域"開發(fā)--將框架與遺留系統(tǒng)和數(shù)據(jù)庫集成是可能的,本章解釋一些 
          集成策略 

          與遺留數(shù)據(jù)庫集成 
          Django的數(shù)據(jù)庫層從Python代碼生成SQL schemas--但是對于遺留數(shù)據(jù)庫,你已經(jīng)擁有SQL schemas,這種情況下你需要為你 
          已經(jīng)存在的數(shù)據(jù)庫表寫模型(由于性能的原因,Django的數(shù)據(jù)庫層不支持通過運(yùn)行時自省數(shù)據(jù)庫的不工作的對象-關(guān)系映射, 
          為了使用數(shù)據(jù)庫API,你需要寫模型代碼),幸運(yùn)的是,Django帶有通過閱讀你的數(shù)據(jù)庫表規(guī)劃來生成模型代碼的輔助工具 
          該輔助工具稱為manage.py inspectdb 

          使用inspectdb 
          inspectdb輔助工具檢查你的settings文件指向的數(shù)據(jù)庫,決定你表示你的表的Django模型并打印Python模型代碼到標(biāo)準(zhǔn)輸出 
          這里是典型的從零開始的遺留數(shù)據(jù)庫處理的過程,唯一的前提是Django已經(jīng)安裝并且你有一個遺留數(shù)據(jù)庫 
          1,通過運(yùn)行django-admin.py startproject mysite(這里mysite是你的項目名)創(chuàng)建Django項目,我們將在例子中使用mysit 
          e作為項目名 
          2,在項目中編輯settings文件mysite/settings.py來告訴Django你的數(shù)據(jù)庫連接參數(shù)是什么以及數(shù)據(jù)庫名是什么,特別的, 
          你將想指定DATABASE_NAME,DATABASE_ENGINE,DATABASE_USER,DATABASE_PASSWORD,DATABASE_HOST和DATABASE_PROT設(shè)置 
          3,通過運(yùn)行python mysite/manage.py startapp myapp(這里myapp是你的app名)來在你的項目中創(chuàng)建Django app,我們這里 
          將使用myapp作為項目名 
          4,運(yùn)行命令python mysite/manage.py inspectdb,這將檢查DATABASE_NAME數(shù)據(jù)庫中的表并為每個表打印模型類,看看輸出 
          來了解inspectdb可以做什么事情 
          5,在你的app里通過使用標(biāo)注shell輸出重定向保存輸出到models.py文件: 
          python mysite/manage.py inspectdb > mysite/myapp/models.py 
          6,編輯mysite/myapp/models.py文件,整理生成的模型并且做你需要的自定義,我們將在下一節(jié)對此給出一些提示 

          整理生成的模型 
          你可能料想到了,數(shù)據(jù)庫省查不是完美的,你將需要做一些輕量的結(jié)果模型代碼的整理,這里是處理生成的模型的一些指示: 
          1,每個數(shù)據(jù)庫表都被轉(zhuǎn)換為一個模型類--即,在數(shù)據(jù)庫表和模型類之間有一個一對一映射,這意味著你將需要對任何多對多 
          鏈接表重整模型為ManyToManyField對象 
          2,每個生成的模型對每個域有一個屬性--包括id主鍵域,盡管如此,如果模型沒有主鍵,調(diào)用它Django會自動添加id主鍵域 
          這樣,如果你非常肛門,你將像刪除任何像這樣的行,因為它們是冗余的: 
          id = models.IntegerField(primary_key=True) 
          3,每個域的類型(如CharField,DateField)通過查看數(shù)據(jù)庫列類型(如VARCHAR,DATE)來決定,如果inspectdb不能映射一個 
          列的類型到模型域,它將使用TextField并在生成的模型中該域附近插入Python注釋"該域類型是猜的",當(dāng)心它,如果需要則 
          對應(yīng)的改變域類型 
          4,如果數(shù)據(jù)庫列名是Python保留字(如pass,class或者for),inspectdb將添加'_field'到屬性名,例如,如果一個表有一 
          個列for,生成的模型將有一個域for_field,db_column屬性設(shè)置為'for'.inspectdb將插入Python注釋'域被重命名因為它是 
          Python保留字'到域附近 
          5,如果你的數(shù)據(jù)庫包含引用到其它表的表(大部分?jǐn)?shù)據(jù)庫這樣做),你可能需要重新安排生成的模型的順序來使引用其它模型 
          的模型正確的排序,例如,模型Foo有一個ForeignKey到模型Bar,則模型Bar應(yīng)該在模型Foo之前定義 
          6,inspectdb為PostgreSQL,MySQL和SQLite檢測主鍵,即它在合適的地方插入primary_key=True,對于其它數(shù)據(jù)庫,你將需 
          要在每個模型中為至少一個域插入primary_key=True,因為Django模型需要有一個primary=True的域 
          7,外鍵檢測只與PostgreSQL和某些類型的MySQL表工作,其他情況下,外鍵域?qū)⑸蔀镮ntegerField(假設(shè)外鍵列為INT列) 


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 会昌县| 凤山市| 综艺| 惠来县| 梨树县| 广水市| 堆龙德庆县| 遂溪县| 高唐县| 岳阳市| 获嘉县| 青州市| 安泽县| 读书| 潼南县| 商都县| 西安市| 安吉县| 房山区| 平南县| 东丰县| 忻州市| 金堂县| 焉耆| 沐川县| 正蓝旗| 池州市| 健康| 赤城县| 桃江县| 长葛市| 井研县| 安国市| 商都县| 巍山| 沙河市| 白银市| 民和| 故城县| 申扎县| 普安县|