2013-05-16 13 views
10

ユーザーがURLにアクセスしてログインし、レポートやその他の情報を表示できるWebアプリケーションを構築しようとしています。ただし、レポートのデータは外部データベースに保存されます。それは私がアクセスするつもりのMySQLデータベースです。djangoを使用して外部データベースからテンプレートにデータを引き出す

私はgoogleで少しの研究をしましたが、多くの幸運はありません。私は複数のデータベースに接続するための少し読んだ - https://docs.djangoproject.com/en/dev/topics/db/multi-db/だから私はデータベースに接続することができます見てok。

次の部分は私が立ち往生した場所です。データベース内のデータは常に更新されます。私は情報を編集することはできません。何も上書きすることはできません。私はDBに接続して必要な情報を取得し、それをユーザーが見ることができるようにテンプレートを通して見ることができるようにしたいだけです。まず、データが常に更新されているため、これは問題になるでしょうか?

私がデータベースに接続したら、データを取り出してテンプレートに出力できる形式にするのが最善でしょうか?モデルにデータをインポートしてからビューで制御する必要がありますか?または、私はJSONまたはXMLでデータを変換する必要がありますか?

私はかなりPython/djangoに新しいので、どんな助けでも大歓迎です。これ以上の情報が必要な場合は、事前にお問い合わせください。 :)

答えて

13

問題ありません!私はいつもこれをやる。

「データを編集したり更新しない」限り、データを更新するものをアプリに追加しないでください。 MySQL側でのパーミッションの使用に関するSalemの提案も良い考えです。

データを取得するために、あなたは2つのオプションがあります。

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}) 

最後に、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

データが更新されている場合は問題ありません。

今のデータベースからデータを取得するためには、まずデータベースへのアクセスを行うために、あなたのテンプレートでは、あなたの意見に

{{r.report_desc}} 
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}) 

を懸念モデル をインポートする必要があり、「読み取り専用"、私は最良の選択肢は、SELECTだけでMySQL側で使用制限を作成することだと思います:

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

外部DBへの接続をテストする方法はありますか?あたかも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

関連する問題