MySQL Error catchen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
lindA
User
Beiträge: 7
Registriert: Mittwoch 9. März 2011, 13:13

Mittwoch 9. März 2011, 13:21

Hallo,

ich bin neu hier und will mich kurz vorstellen. Ich studiere, bin 23, komme aus Berlin und arbeite nebenbei gerne mit Python. Mittlerweile habe ich mich an ein kleines Projekt mit web2py gewagt, dass ich in Verbindung mit einer MySQL DB nutze.
Nun steh ich aber vor einem Problem, dass ich bis jetzt trotz langer Suche nicht beseitigen konnte. Es mag fuer einige von euch trivial erscheinen aber ich finde leider immer noch keine Loesung deswegen habe ich mich hier angemeldet.
Also ich moechte, dass externe User auf mein DB per Select Statement zugreifen koennen. Das funktioniert auch alles und ist sicher. Dazu gibt der User in ein HTML Formular sein SQL Statement ein und das wird ausgefuehrt. Mein Problem liegt jetzt darin:
Handelt es sich um ein falsches Statement sprich der SQL Ausdruck ergibt einen Syntax Error kann ich den Fehler abfangen und ausgeben, allerdings bekomme ich nicht den genau Fehler. Ich haette gerne, dass bei einem Synatx Error die ganz normale SQL Error Meldung alla 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from bla bla' at line 1 ' kommt!?
Wie kann kann ich die abfangen??
Hier mein bisheriger Aufbau:

Code: Alles auswählen

def sql_output():
	
    try:
	command=request.vars['command']

	# if one char = ';' delete it otherwise LIMIT 10; is not working
	command = command.replace(';','')
	    
    	conn = MySQLdb.connect (XXX die Daten sind entfernt ;) )

    	cursor = conn.cursor ()
    	cursor.execute(command + " Limit 10;")
    	data = cursor.fetchall()
    	col_names = cursor.description

    	if data != None:
    	    return dict(data=data,message=T(command),col_names=col_names)
    	    
    	cursor.close ()
    	conn.close ()

    except:
        return dict(data="",message=T('Error in SQL Syntax please try again.'),col_names="")
try und except funktioniert aber ich komm eben nicht an den genauen Wortlaut des Errors ran :(

Vielen Dank fuer Hilfe, lindA
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mittwoch 9. März 2011, 13:33

Willkommen im Forum!
http://mysql-python.sourceforge.net/MySQLdb.html hat geschrieben:There's no return value from this, but exceptions can be raised. The exceptions are defined in a separate module, _mysql_exceptions, but _mysql exports them. Read DB API specification PEP-249 to find out what they are, or you can use the catch-all MySQLError.
PEP-249
Zuletzt geändert von cofi am Mittwoch 9. März 2011, 17:11, insgesamt 1-mal geändert.
lindA
User
Beiträge: 7
Registriert: Mittwoch 9. März 2011, 13:13

Mittwoch 9. März 2011, 13:46

Danke fuer die schnelle Antwort.
Auf dieser Seite war ich auch schon mal und habe sie mir durchgelesen.
Aber ich finde da doch nur die Standard Error, wie Cursor Errors auf die ich ja nicht aus bin.
Ich will nur dem User sagen, was er falsch gemacht hat bei seinem Statement, dass er es verbessern kann.
:K

Gruss lindA
Benutzeravatar
sparrow
User
Beiträge: 2801
Registriert: Freitag 17. April 2009, 10:28

Mittwoch 9. März 2011, 13:52

Für den Fehler den du abfangen möchtest doch mal herbei und zeig dir und uns den StackTrace.
Meistens wird man daraus schon schlauer.

Ich mache zu selten etwas mit mySQL um es dir aus dem Stehgreif beantworten zu können.

Gruß
Sparrow
lindA
User
Beiträge: 7
Registriert: Mittwoch 9. März 2011, 13:13

Mittwoch 9. März 2011, 14:02

Nein entweder versteht ihr mich falsch oder ich euch :D
Ich will jeden Fehler einfach ausgeben koennen der durch SQL entsteht.

Wenn ich Solect ..... statt Select in meine MySQL Konsole schreibe bekomm ich den Fehler:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Solect * from XXX' at line
Und genau diese Fehlermeldung die mir da ausgegeben werden wuerde ich gerne abfangen und auch auf meiner Homepage ausgeben.. egal ob falsche DB oder nicht vorhande table angegeben ist wird ja immer der Fehler ausgegeben und den haette ich auch immer gerne..

Danke, Gruss lindA
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mittwoch 9. März 2011, 14:15

`except Exception, e:` statt dem blanken `except`. An die Fehlernachricht kommst du dann per `str(e)`
lindA
User
Beiträge: 7
Registriert: Mittwoch 9. März 2011, 13:13

Mittwoch 9. März 2011, 14:29

Juhu,

vielen Dank genau das habe ich gesucht :)

Tausend Dank!!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 9. März 2011, 16:12

Aber warum schreibst du "rohes" SQL, wenn du web2py nutzt was meines wissens mit irgendwas ORM-mäßigem daherkommt?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lindA
User
Beiträge: 7
Registriert: Mittwoch 9. März 2011, 13:13

Mittwoch 9. März 2011, 16:45

Keine ahnung, ob ich dich richtig verstehe aber es geht darum, dass jeder eine
SQL Statement in ein Formular eingibt, welches das Statement dann an eine Python Funktion weitergibt, die
dann das Ergbnis dazu ausliest und als <table> ausgibt oder was meinst du mit rohem SQL?

Da ich gerade dabei bin. Ich habe schon das naechste Problem, wobei das mit pyhhon weniger zu tun hat aber vll hat jemand ne Loesung parat, da ich jez schon wieder ueber 3Stunden google :( und probiere:

Ich will eine Outfile per SQL erstellen was auch alles funktioniert alla

Code: Alles auswählen

Select * into outfile 'xyz.csv' from irgendwas;
Jetzt wird die Outfile auf den MySQL Server geschrieben. Auf meinen Server kann ich es nicht schreiben, da MySQL dafuer nicht die Rechte besitzt und ich komm leider nich an den Admin im Moment ran :(

Gibt es ne Moeglichkeit die Datei xyz.csv die wohl in var/lib/mysql liegt aus dem Web herunterzuladen? Ich hab keine Ahnung wie ich an diese Datei komme?

Danke und Gruss, tolles Forum uebrigens =) schnelle und konstrukitve Antworten das ist top :!:

lindA
Benutzeravatar
noisefloor
User
Beiträge: 3209
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Mittwoch 9. März 2011, 17:43

Hallo,

das geht über einen Umweg: Du machst eine _reguläre_ SQL-Abfrage und schreibst das Ergebnis dann selber in eine Datei (Stichwort: tempfile) oder Datei-ähnliches Objekt (Stichwort: StringIO). Die kannst du dann auch an den Nutzer senden.

Gruß, noisefloor
lindA
User
Beiträge: 7
Registriert: Mittwoch 9. März 2011, 13:13

Mittwoch 9. März 2011, 17:47

Das hab ich auch schon gemacht. Das Problem ist, dass im worste Case 5.9 Mio Datensaetze abgerufen werden und das dauert dann zu lange deswegen muss ich gezwungenermassen auf OUTFILE von SQL zurueckgreifen, da der das in 10sek gebacken bekommt.
In i/O String schreiben dauert bei kleineren Abfragen schon sehr lange.

Gruss
Antworten