用 Django 管理現有資料庫

2022-01-10 03:34:10 字數 3120 閱讀 9613

在多數專案中,總有一些幾乎一成不變的 crud 操作,編寫這些**很無聊,但又是整個系統必不可少的功能之一。我們在上乙個專案中也面臨類似的問題,雖然已經實現了乙個功能相對完整的管理後台,也盡量做到了**復用,但隨著專案規模的增長,需要編寫的樣本**也不斷膨脹,占用了大量開發時間。

面對這種局面,我自然想到了 django。要知道, django admin 幾乎就是為這種需求量身定製的。但對於我們的專案而言,還有幾個問題要解決:

遺憾的是,針對 django 開發的 sql server 介面卡雖然有幾種,但都比較古老了,對新版的 django 支援存在問題。經過嘗試,我們選擇了 django-mssql,雖然功能是可用的,但該庫只支援到 django 1.8,經測試,對 django 1.11 不相容,django 2.x 就更不行了。好在我們並不需要很新的功能,因此就用 virtualenv 鎖定版本了:

django==1.8

django-mssql==1.8

pywin32==223

在這裡還是要推薦下我自己建的python開發學習群:725479218,群裡都是學python開發的,如果你正在學習python ,小編歡迎你加入,大家都是軟體開發黨,不定期分享乾貨(只有python軟體開發相關的),包括我自己整理的乙份2018最新的python高階資料和高階開發教程,歡迎高階中和進想深入python的小夥伴

django-mssql 是 windows 版的庫,幕後使用了 ado 為驅動,因此同時還要安裝 pywin32。

針對第二和第三個問題基本上有兩個思路。第乙個是通過實現自定義的 backend 來跳過 django 內建的、基於資料庫的實現。從原理上來講是行得通的,但簡單嘗試了一下,發現要自定義的部分相當多,工作量太大。總之,這條路不是很可取。

第二個思路是利用 django 的多資料庫支援。既然業務資料庫不可由 django 來管理,那麼就再用乙個資料庫來支援 django 的基本功能,而 django 對業務資料庫只作查詢和更新,不執行 migrate。當然,為了使用多個資料庫,我們需要在配置上多做一些工作。由於使用後台的使用者基本上只有公司內部的業務人員,資料量不會大,用伺服器級的資料庫有牛刀之嫌。處於簡便考慮,這裡使用預設的 sqlite 作為內建資料庫:

databases = ,

'mydb':

}}

需要說明,django-mssql 為 provider 選項提供的預設值(按照官方文件應為 sqlcli10)實測會導致出現「找不到提供程式」 的錯誤。由於 provider 的設定取決於 ado 的註冊資訊,不一定在所有機器上都相同,所以你可能需要自己測試決定哪個選項可用。

現在我們配置了兩個資料來源,但還需要告訴 django 它們和模型的對照關係。實現這一點可以在語句/實體/全域性等多種級別定義。對於我們的需求而言,對應關係是固定的,逐個模型定義並無必要,通過全域性定義是最簡單的。實現這一定義的物件在 django 的術語中稱為資料庫路由(database router)。首先在 settings.py 中定義類名:

然後完成類的實現:

def db_for_read(self, model, **hints):

return none

def db_for_write(self, model, **hints):

return none

def allow_relation(self, obj1, obj2, **hints):

return none

return false

資料路由需要按照 django 的要求實現四個方法。其中主要是讀寫兩個方法,我們需要根據傳來的模型決定匹配到哪個資料來源。 其他兩個方法目前意義不大,按照預設的實現即可。

配置到此完成,接下來需要建立模型。對於已經存在的資料表,可以用管理命令 inspectdb 反向生成**,減少一些手工輸入的負擔。但生成的**未必完全符合你的要求,所以還是應該自己檢查一下。對於 sql server,如果主鍵名不是預設的 id,那麼 inspectdb 似乎不會自動識別到它們,所以我們需要檢查一下主鍵字段有無 primary_key,如果沒有的話就加上。

為了方便除錯和辨別記錄,一般來說我們還要為模型類加上 verbose_name 並過載內建的字串方法。

class xxmodel(models.model):

xxid = models.bigintegerfield(primary_key=true)

...class meta:

managed = false

db_table = 'xxmodel'

verbose_name = '模型名稱'

verbose_name_plural = '模型名稱'

def __str__(self):

return self.xxfield

把模型新增到 admin,對應的後台管理資訊就完成了。

admin.site.register(xxmodel, xxadmin)
最後,為內建資料庫生成必要的表,建立管理員賬戶,即可執行程式。以下命令就無需說明了:

$ python manage.py migrate

$ python manage.py createsuperuser

$ python manage.py runserver

我們第乙個版本的後台程式是自己手工編碼完成的,用了大概兩周的時間。問題在於,每增加乙個模型都要手工新增大量樣本**。而改寫成 django 只用了一天時間,包括熟悉相關資料和使用方法,增加乙個模型只需花幾分鐘。這也是為什麼很多了解 django 的開發者轉移到其他平台以後,會尋找類似的專案。就我了解的範圍,spring boo 和 django 在概念上比較類似,但 boo 主要走的是**生成的路線,複雜度更高,理論上靈活性也應該更好一些(我沒有深度研究過)。nodejs 社群有 keystone.js 和 sails.js,不過前者專門針對 mongodb,後者支援多種資料庫後端,但風聞最近有停止開發的跡象。.net 社群以前有乙個 dynamicdata,現在似乎也沒了下文。發展多年的 django 也應該算是同類產品中最成熟、生態也最為完整的產品了。

django 潛在的問題在於不夠現代化的介面,以及深度定製較為困難。不過對於我們的後台應用來說,這些都是可以接受的代價。

Django 匯入現有資料庫

inspectdb 工具自省你配置檔案指向的 資料庫 針對每乙個表生成乙個django模型,然後將這些 python 模型的 顯示在系統的標準輸出裡面。配置好資料庫之後,執行如下命令 很強大,可以省去不少功夫,而且這也比較符合我一貫的邏輯,但是資料庫的反向工程總是不會那麼的盡如人意的 1.如果資料表...

Android 載入現有資料庫檔案

想把乙個資料庫db檔案放在 res raw 目錄下,安裝應用的時候就直接載入這個db檔案到程式預設資料庫目錄下 data data package name databases db name,這樣就不用每次安裝的時候都用sql語句建立新的資料庫。下面的 就是將 res raw 目錄下的.db資料庫...

PD逆向工程從現有資料庫生成PDM

powerdesigner 版本16.5 在powerdesigner中逆向生成 1,開啟powerdesigner工具,建立乙個pdm檔案,選擇與之匹配的資料庫型別 sqlserver2012 建立方法為 右鍵點選左側面板中的workspace new physical data nodel 在d...