2016-09-02 2 views
0

MySQL 서버에서 응용 프로그램의 데이터를 CSV 형식으로 다운로드하려면 Django 앱에 링크를 넣으 려합니다. 그 일을 쉽게 할 수있는 방법이 있습니까?Django에서 데이터베이스 링크 다운로드

수정 : 데이터베이스를 말하면 관련 테이블을 하나의 파일로 의미 했으므로 다운로드하기 전에 관련 테이블을 사용해야합니다. 클라이언트를 위해이 작업을 수행하고 있으므로 로그 테이블과 사용자 테이블을 포함하여 모든 테이블을 볼 필요가 없습니다. 또한 전체 관계형 데이터베이스 대신 기본보고 용으로 하나의 파일 만 사용할 수 있습니다. 먼저, 관계형 데이터베이스를 비정규 화하고 다운로드 할 준비를해야합니다. 이것의

+0

내가 장고 가져 오기/내보내기를 찾고 싶습니다 – 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> 

분명히 실제로보기 논리 내부에서 데이터 덤프를하지 마십시오. 이렇게하면 작업 속도가 느려지므로 코드 기반의 다른 곳에서 비동기로 처리하는 것이 좋습니다 이자형.

+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> 

나는 아직도이 최선의 해결책이 완벽하게 확실하지 않다, 내 템플릿에이를 추가합니다. 그러나 이것은 내가 지금 할 수있는 능력이며, 잘 작동합니다.