2017-02-27 1 views
0

Ich versuche, eine CSV-Datei nach einer MySQL-Abfrage zu exportieren. Ich erhalte den folgenden Fehler;Mysql Fehler auf Django

(1064: "Sie haben einen Fehler in der SQL-Syntax, das Handbuch überprüfen, die für die richtige Syntax zu Ihrem MySQL-Server-Version entspricht in der Nähe zu verwenden '' at line 1")

import csv 

from django.db import connections 

from django.http import HttpResponse 

from django.views.generic import ListView 

from testing.models import TrRunSummary, TrDetails 


class ExportCsv(ListView): 
    """Displays the different tests performed on the specified test request""" 
    template_name = 'testing/tr_export_csv.html' 
    context_object_name = 'export_csv' 

    def get_context_data(self, **kwargs): 
     context = super(ExportCsv,self).get_context_data(**kwargs) 
     context['tr_info'] = self.tr_info() 

     return context 

    def get_queryset(self): 
     qtr_id = self.kwargs['trID'] 
     s = str(qtr_id) 
     print s 
     print type(s) 



cursor = connections['default'].cursor() 
    query ="SELECT results_stb_id, results_stbs.stb_id, stb_inv.mac_add, " 
    "test_functionality.test_functionality_code, test_cases.test_case_no, " 
    "SCRIPT.option_name AS script_result, POST.option_name AS post_result, " 
    "results_tests.started, results_tests.stopped, results_tests.test_duration, builds.baseline, " 
    "builds.build_type, stb_hw_info.stb_type, defects.defect_name, parser_output, log_url, " 
    "script_health_score, post_health_score FROM results_stbs " 
    "JOIN tr_test_cases " 
    "ON tr_test_cases.tr_test_case_id=results_stbs.tr_test_case_id " 
    "JOIN test_cases " 
    "ON test_cases.test_case_id=tr_test_cases.test_case_id " 
    "JOIN test_functionality " 
    "ON test_functionality.test_functionality_id=test_cases.test_functionality_id " 
    "LEFT JOIN stb_inv " 
    "ON results_stbs.stb_id=stb_inv.stb_id " 
    "LEFT JOIN result_options AS SCRIPT " 
    "ON results_stbs.script_result=SCRIPT.result_option_id " 
    "LEFT JOIN result_options AS POST " 
    "ON results_stbs.post_result=POST.result_option_id " 
    "JOIN results_tests " 
    "ON results_stbs.results_test_id=results_tests.results_test_id " 
    "JOIN builds " 
    "ON builds.build_id=results_stbs.build_id " 
    "JOIN stb_hw_info_ids " 
    "ON stb_hw_info_ids.stb_hw_info_ids_id=results_stbs.stb_hw_info_ids_id " 
    "JOIN stb_hw_info " 
    "ON stb_hw_info.stb_hw_info_id=stb_hw_info_ids.stb_hw_info_id " 
    "LEFT JOIN defects_tests " 
    "ON results_tests.results_test_id=defects_tests.results_test_id " 
    "LEFT JOIN defects " 
    "ON defects.defect_id=defects_tests.defect_id " 
    "WHERE tr_test_cases.tr_id = '%s' AND script_result IN (1, 3, 8) " 
    "OR tr_test_cases.tr_id = '%s' AND post_result IN (1, 3, 8) " 
    "ORDER BY results_stb_id ASC " % (s, s) 


     cursor.execute(query) 

     print cursor 



    def tr_info(self): 
     tr_id = self.kwargs['trID'] 
     tr_info = TrDetails.objects.get(
      tr_id=tr_id, 
     ) 
     return tr_info 



class SavedCsvView(ExportCsv): 
    """ 
    Subclass of above view, to produce a csv file 
    """ 
    template_name = 'TR_Export.csv' 
    content_type = 'text/csv' 

Meine Anfrage funktioniert gut mit Python Script. Wenn ich die Django-Ansichten hinzufüge, gibt es einen Fehler. Irgendwelche Hilfen würden geschätzt werden.

+0

Sie bitte die vollständige Zurückverfolgungs Paste für Fehler –

+0

Sie die direkte SQL-Abfrage auf diese Weise ausführen kann https://docs.djangoproject.com/en/1.10/topics/db/sql/# executing-custom-sql-direct –

+3

Beende die Zeilen mit den Zeichenfolgen mit '\ 'oder verwende dreifache Anführungszeichen oder umkreise alles nach dem' = 'mit'() ', um eine Mehrfachzeile zu erstellen Zeichenfolge. Wie du es gemacht hast, kommt nur der erste Teil in die Saite. –

Antwort

0

Wie bereits in den Kommentaren von Klaus D aus

die Linien mit or use triple quotation marks or surround everything after the= mit den Saiten Terminate mit() einer mehrzeiligen Zeichenfolge zu erstellen. Wie du es gemacht hast kommt nur der erste Teil in den String. - Klaus D.

sollten Sie die Abfrage Zeichenfolge mit <tripple quotes> """<query>""" beheben.

def get_queryset(self): 
    ... 
    query = """SELECT results_stb_id, results_stbs.stb_id, stb_inv.mac_add, 
     test_functionality.test_functionality_code, test_cases.test_case_no, 
     SCRIPT.option_name AS script_result, POST.option_name AS post_result, 
    ...""" 
    cursor.execute(query) 
    row = cursor.fetchall() 
    return row 

Wie Abfrageantwort Cursor von einer direkten SQL-Abfrage auf db, siehe doc zurück: https://docs.djangoproject.com/en/1.10/topics/db/sql/#executing-custom-sql-directly

und dieses Beispiel: http://blog.appliedinformaticsinc.com/how-to-perform-raw-sql-queries-in-django/

OP

eine andere Frage in den Kommentaren hinzugefügt

Hallo @KlausD. Danke für deine Hilfe. Klammern helfen mir, das Problem zu lösen. Also, wie kann ich diese Abfrage ausführen, um CSV-Datei zu exportieren? Vielen Dank :)

Um Abfrage Antwort auf CSV zu exportieren, gibt es mehrere Optionen:

Man ist gerade nach vorne django Ansatz [Referenz] https://docs.djangoproject.com/en/1.10/howto/outputting-csv/

Ein weiterer Grund ist diese Bibliothek verwenden https://pypi.python.org/pypi/django-queryset-csv/

, die sehr einfach zu bedienen ist

from djqscsv import render_to_csv_response 

def csv_view(request): 
    qs = Foo.objects.filter(bar=True).values('id', 'bar') 
    return render_to_csv_response(qs) 

wenn Sie nur wollen, zu csv Verwendung schreibe dies:

from djqscsv import write_csv 

qs = Foo.objects.filter(bar=True).values('id', 'bar') 
with open('foo.csv', 'w') as csv_file: 
    write_csv(qs, csv_file)