2016-09-02 5 views
0

MySQLサーバーからアプリケーションのデータをCSV形式でダウンロードするには、私のDjangoアプリケーションにリンクを張りたいと思います。それを行う簡単な方法はありますか?Djangoのデータベースへのリンクをダウンロード

修正:私がデータベースと言うとき、関連するテーブルを1つのファイルとして意味しました。つまり、ダウンロードする前にそれらに参加する必要があります。私はクライアントのためにこれをやっているので、ログテーブルとユーザーテーブルを含むすべてのテーブルを見る必要はありません。また、リレーショナルデータベース全体ではなく、基本的なレポート作成に1つのファイルしか使用できません。ですからまず、リレーショナルデータベースを非正規化してダウンロードする準備をしておく必要があります。この

+0

私はdjangoインポート/エクスポートを検討することをお勧めします – Foon

答えて

1

ややduplciate:django download csv file using a link

あなたはこのような何か行うことができます:あなたのビューで次に

from io import StringIO 

from django.core import management 


def create_fixture(app_name, filename): 
    buf = StringIO() 
    management.call_command('dumpdata', app_name, stdout=buf) 
    buf.seek(0) 
    with open(filename, 'w') as f: 
     f.write(buf.read()) 


class YourPage(...): 
    .... 

    def dispatch(self, *args, **kwargs): 
     create_fixture('<yourapp>', '<yourapp>/static/reports/test.csv') 
     return super(YourPage, self).dispatch(*args, **kwargs) 

を、(あなたが正しく静的なファイルパスを設定したと仮定した場合)

{% load staticfiles %} 
<a href="{% static '<yourapp>/test.csv' %}">Download CSV</a> 

明らかに実際にはビューロジック内でデータダンプを実行しないでください。これにより処理速度が遅くなるため、コードベース内の別の場所で非同期処理を実行することを検討してくださいe。

+0

ありがとうジャック、しかし、私は簡単な解決策を見つけました。率直に言って、私はあなたのアプリに私のアプリを実装できませんでした。 –

0

この問題は、テーブルに参加してダウンロードする外部関数を作成し、そのダウンロードファイルを指す静的ファイルにリンクを提供することで解決します。

はここ

def database_downloader(): 
    import pymysql # run pip install pymysql if this fails 
    import sys 
    import time 
    import csv 

    start = time.time() 
    connect = 0 
    attempt = 1 
    while connect==0: #if connection is not secured, will try again in 3 seconds. 
     try: 
      print "connecting, attempt "+str(attempt) 
      conn = pymysql.connect(host='url', port=3306, user='username', passwd='pass', db='db', autocommit=True) #setup our credentials 
      cur = conn.cursor() 
      connect = 1 
     except: 
      print "try again in 3 seconds" 
      time.sleep(3) 
      attempt+=1 
      continue 

    print "connected to server in " +str(time.time()-start)+ " seconds." 

    out_file = open("main_app/static/main_app/reports/output.csv", "wb") 
    writer = csv.writer(out_file) 

    sql = "SELECT * FROM main_app_basic_info b LEFT JOIN main_app_add_info a ON a.Student_ID = b.Student_ID;" 
    cur.execute(sql) 

    column_names = [] 
    for i in cur.description: 
     column_names.append(i[0]) 
    writer.writerow(column_names) 

    for i in cur.fetchall(): 
     writer.writerow(i) 

    print "Downloading completed in " + str((time.time()-start)) + " seconds." 
    out_file.close() # you need to close to save before sending 

は、その後、私はこの機能にページがロードは、それが更新され、ダウンロードする準備ができて維持するたびに実行、私のヘルパー関数です。このように、

def index(request): 
    student_list = basic_info.objects.order_by('-id')[:5] 
    student_list_full = basic_info.objects.order_by('-id') 
    context = {'student_list': student_list, 'student_list_full': student_list_full} 
    database_downloader() # this downloads the database in every refresh to main_app/reports/output.csv 
    return render(request, 'main_app/index.html', context) 

は最後に、私は

{% load static %} 
<div><a href="{% static "main_app/reports/output.csv" %}" download>Click Here to Download to Database</a></div> 

私はまだこれが最善の解決策であることを完全にはよく分からない、私のテンプレートにこれを追加します。しかし、これは私が今やっている能力であり、うまくいきます。

関連する問題