2013-05-16 32 views
10

我將試圖建立一個Web應用程序,用戶可以訪問一個網址,登錄和查看報告和其他信息拉取數據的模板。但是,報告的數據存儲在外部數據庫中。這是一個我將要訪問的MySQL數據庫。從外部數據庫和Django

我已經做了谷歌一個小小的研究,沒有多少運氣找到任何例子。我已經做了一些閱讀連接到多個數據庫 - https://docs.djangoproject.com/en/dev/topics/db/multi-db/因此,它看起來我可以連接到數據庫好。

接下來的部分是我被卡住的地方。數據庫中的數據將隨時更新。我不想編輯信息,我也不想覆蓋任何東西。我只是想能夠連接到DB拉取所需的信息,然後通過模板查看它,供用戶能夠看到。首先,因爲數據一直在更新,這是否會成爲問題? (我希望不會!)

一旦我連接到數據庫,什麼是最好要能拉出數據,然後把它變成一種格式,我可以輸出到模板?我需要將數據導入到模型中,然後使用視圖進行控制。或者我需要用JSON或XML轉換數據?

我是相當新的Python/Django的,所以任何幫助,將不勝感激。如果您需要更多信息,請提前詢問並致謝。 :)

回答

13

沒問題!我一直這樣做。

至於「不要編輯或更新數據」,只是不要添加任何東西到您的應用程序,將更新數據。塞勒姆關於在MySQL方面使用權限的建議也是一個好主意。

對於檢索數據,你有兩個選擇:

1)您可以創建對應於MySQL數據庫的表Django模型。您可以手動執行此操作,也可以使用manage.py中的「inspectdb」命令爲自己提供一個良好的起點。然後做這樣的事情:

def myview(request): 
    rows = MyModel.objects.using('mysql').all() 
    return render_to_response("mytemplate.html", {"rows" : rows }) 

2)您可以在您的應用程序中手動管理連接和查詢。這在視圖中是完全有效的:

def myview(request): 
    conn = MySQLdb.connect("connection info here") 
    try: 
    cursor = conn.cursor() 
    cursor.execute("select * from mytable") 
    rows = cursor.fetchall() 
    finally: 
    conn.close() 

    return render_to_response("mytemplate.html", {"rows" : rows}) 

finally - Django非常樂意將MySQL用作數據庫。如果您的DBA會讓Django在同一個數據庫中創建表格,它可能會簡化一些操作。

+0

感謝您的所有回覆,給我足夠的信息繼續。我需要設置一個新的應用程序將信息拉入新的models.py文件嗎?另外,當數據被拉入模型中時,信息是否會更新每天我刷新頁面,就好像在模板上顯示一樣? – JDavies

+0

您不需要爲MySQL類別單獨安裝一個應用程序,但歡迎您創建它。我正在查看我的代碼,並將我的遠程設置設置爲模型的子模塊。 (myapp/models,myapp/models/somethingelse,myapp/models/anotherthing)。這是因爲在我的情況下,myapp/models中的項目包含「somethingelse」和「otherthing」的實例。你也可以創建一個新的應用程序來隔離它,或者你可以只加前綴所有的名字。 –

+0

WRT數據更新:如果您使用上述示例,則答案爲「是」。該查詢將在每次執行時被執行並立即生效。如果您不想要這種行爲,您必須添加自己的緩存。 –

1

有打算,如果數據被更新,是沒有問題的。

現在,用於從數據庫中的數據,你首先必須導入有關模型 在你的意見

from app_name.models import model_name 
def view_report(request): 
    r_name=request.POST.get('r_name','default_value') 
    r=model_name.objects.get(report_name=r_name) 
    return render_to_response('url',{'r':r}) 

在模板

{{r.report_desc}} 
1

要對數據庫的訪問權限「只讀「,我想最好的選擇是創建一個有限的MySQL端使用只有SELECT:

GRANT SELECT ON target_database.* TO [email protected]'your_host' IDENTIFIED BY 'your_password'; 

這將確保在任何情況下更新/更改都會成功。

通常,您將數據庫表建模爲對象,因爲這樣可以更輕鬆地使用Python中的數據庫記錄併爲您提供一些抽象,但如果您覺得這是正確的選擇,則可以執行raw SQL queries

根據您想如何表達你的數據,你可能需要將其轉換爲東西。

如果您希望使應用程序更具動態性(例如,以10秒的時間間隔檢索新數據並在不刷新的情況下將其呈現給用戶),您可能需要將其轉換爲更適合與AJAX一起使用的某種格式,像JSON或XML(Django有一些serialization工具可以使用)。如果您只想要一個「靜態」應用程序(例如:用戶單擊鏈接/按鈕並轉至顯示數據的頁面,並刷新用戶必須刷新頁面),則可以使用從數據庫中檢索的對象在你看來。

+0

有沒有辦法可以測試連接到外部數據庫?就像運行GUI一樣運行腳本? – JDavies

+0

是的,你可以使用'from django.db import connections; c = connections [「external_db」]。cursor()'。你可以把它封裝在try/except塊中(如果你沒有得到任何異常連接是成功的)。另外檢查[this](http://stackoverflow.com/a/6894615/1205368)。 – Salem

+0

真的很好的細節。它是否支持新版本的Django 1.10,是否有更好的方式來實現它?我寧願在settings.py中定義我的外部數據庫。 – nomad