2009-05-05 5 views
3

MySqlDb ist ein fantastisches Python-Modul - aber ein Teil ist unglaublich nervig. Abfrageparameter wie folgt aussehenWie verwenden Sie das Python Msqldb-Modul? anstelle von% s für Abfrageparameter?

cursor.execute("select * from Books where isbn=%s", (isbn,)) 

während überall sonst im bekannten Universum (Oracle, SQL Server, Zugang, sybase ...) sie diese aussehen

cursor.execute("select * from Books where isbn=?", (isbn,)) 

Das bedeutet, dass, wenn Sie wollen tragbar zu sein, müssen Sie irgendwie zwischen den beiden Notationen wechseln? und% s, was wirklich nervig ist. (Bitte sagen Sie mir nicht, eine ORM-Schicht zu verwenden - ich werde Sie erwürgen).

Angeblich können Sie mysqldb dazu verleiten, die Standardsyntax zu verwenden, aber ich habe es noch nicht hat es funktioniert. Irgendwelche Vorschläge?

+0

Tatsächlich haben neuere Systeme benannte Parameter, die wie folgt aussehen: "Select * from Books wo isbn = @ISBN" –

Antwort

2

Ich fand heraus, eine Menge Informationen dort über paramstyle, die es zu implizieren schien sein könnte, was Sie wollen, aber according to this wiki Sie haben die paramstyle Ihrer Bibliothek Anwendungen zu verwenden, und die meisten von ihnen nicht erlauben, sie zu ändern:

paramstyle ist spezifisch für die Bibliothek, die Sie verwenden, und informativ - Sie müssen die verwenden, die es verwendet. Dies ist wahrscheinlich der nervigste Teil dieses Standards. (Einige können Sie verschiedene paramstyles setzen, aber das ist nicht das Standardverhalten)

ich einige Einträge gefunden, die über MySQLdb erlaubt gesprochen, aber es funktioniert anscheinend nicht als jemand bezeichnet es nicht funktionierte Sie.

+0

Das hat nicht für mich funktioniert und ich bin ziemlich sicher, dass ich die neueste Version von MySQLdb habe. Ist das wirklich alles da? –

+0

Es gibt viele Informationen, die darauf hindeuten, dass es ist, aber die Dokumentation (zumindest was ich finden konnte) ist nicht wirklich solide, also weiß ich es wirklich nicht. –

1

Ich empfehle dies zu tun es nicht, aber die einfachste Lösung ist es, die Cursor Klasse monkeypatch: ‚?‘

from MySQLdb.cursors import Cursor 
old_execute = Cursor.execute 
def new_execute(self, query, args): 
    return old_execute(self, query.replace("?", "%s"), args) 
Cursor.execute = new_execute 
2

Von dem, was ich sehe, können Sie nicht verwenden können, für einen Parameter Marker mit MySQLdb (aus der Box)

Sie können jedoch benannte Parameter

dh

cursor.execute("%(param1)s = %(param1)s", {'param1':1}) 

effektiv 1=1

in mysql

ausführen würde verwenden

aber Art wie Eli antwortete (aber nicht hackish)

Sie stattdessen tun könnte:

in diesem Fall

MyNewCursorModule.py

import MySQLdb.cursors import Cursor 

class MyNewCursor(Cursor): 
    def execute(self, query, args=None): 
    """This cursor is able to use '?' as a parameter marker""" 
    return Cursor.execute(self, query.replace('?', '%s'), args) 

    def executemany(self, query, args): 
    ...implement... 

Sie würden einen benutzerdefinierten Cursor haben, die tun würde was Sie wollen es zu tun und ist es kein Hack.Es ist nur eine Unterklasse;)

und verwenden Sie es mit:

from MyNewCursorModule import MyNewCursor 

conn = MySQLdb.connect(...connection information... 
         cursorclass=MyNewCursor) 

(Sie können auch die Klasse der connection.cursor Funktion geben sie dort zu erstellen, wenn Sie die normale ausführen meisten verwenden möchten die Zeit (ein Temp Override))

... Sie können auch den einfachen Ersatz zu etwas ein wenig mehr korrigieren (vorausgesetzt, es gibt eine Möglichkeit, das Fragezeichen zu entkommen), aber das ist etwas, was ich werde überlasse dir :)

Verwandte Themen