2009-03-04 8 views
1

Mit Pysqlite kann ein benutzerdefinierter Typ als Wert in einem Vergleich verwendet werden, z. g: "... WHERE columnName> Benutzertyp"?pysqlite-Benutzertypen in Select-Anweisung

Zum Beispiel habe ich einen Bool-Typ mit der erforderlichen Registrierung, Konverter usw. definiert. Pysqlite/Sqlite reagiert wie erwartet auf INSERT- und SELECT-Operationen (bool 'True' wird als Ganzzahl 1 gespeichert und als True zurückgegeben).

Aber es schlägt fehl, wenn die Bool in entweder "SELECT * von Aufgaben WHERE Display = True" oder "... WHERE Display = 'True" verwendet wird. "Im ersten Fall meldet Sqlite einen Fehler, dass es keine Spalte namens True gibt. Und im zweiten Fall werden keine Datensätze zurückgegeben. Die Auswahl funktioniert, wenn anstelle von True eine 1 verwendet wird. Ich scheine das gleiche Problem zu haben, wenn ich pysqlites eigene Datums- und Zeitstempeladapter verwende.

Ich kann dieses Verhalten für diese und andere Benutzertypen umgehen, aber das ist nicht so lustig. Ich würde gerne wissen, ob die Verwendung eines benutzerdefinierten Typs in einer Abfrage möglich ist oder nicht, so dass ich nicht ständig meinen Kopf auf diese bestimmte Wand hämmere.

Vielen Dank.

Antwort

0

Sie müssen es wahrscheinlich auf den richtigen Typ umwandeln. Versuchen Sie "SELECT * FROM Aufgaben WHERE (Anzeige = CAST ('True' AS bool))".

+0

danke, ich werde versuchen, diese – Strider1066

1

Verwenden Sie die korrekte Methode zur Übergabe von Variablen an Abfragen: Erstellen Sie die Abfrage nicht, verwenden Sie Fragezeichen und übergeben Sie die Parameter als Tupel an execute().

myvar = True 
cur.execute('SELECT * FROM tasks WHERE display = ?', (myvar,)) 

diese Weise wird die SQLite-Treiber direkt den Wert verwenden. Kein Entkommen, Zitieren, Umsetzen ist mehr nötig.

Verwenden Sie diese Technik für jeden Parameter, auch String, Integer usw. Auf diese Weise vermeiden Sie SQL-Injektion automatisch.

+0

danke, ich werde das versuchen – Strider1066