2009-03-04 8 views
1

En utilisant pysqlite, comment un type défini par l'utilisateur peut-il être utilisé comme valeur dans une comparaison, e. g: "... WHERE nomColonne> type_utilisateur"? Par exemple, j'ai défini un type bool avec l'enregistrement, le convertisseur requis, etc. Pysqlite/Sqlite répond comme prévu pour les opérations INSERT et SELECT (bool 'True' stocké comme un entier 1 et retourné comme True).Types d'utilisateurs pysqlite dans l'instruction select

Mais cela échoue lorsque le booléen est utilisé dans "SELECT * à partir des tâches WHERE display = True" ou "... WHERE display = 'True'. "Dans le premier cas, Sqlite signale une erreur indiquant qu'il n'y a pas de colonne nommée True. Et dans le second cas, aucun enregistrement n'est renvoyé. Le select fonctionne si un 1 est utilisé à la place de True. Je semble avoir le même problème en utilisant les propres adaptateurs de date et d'horodateur de pysqlite.

Je peux contourner ce problème pour ceci et d'autres types d'utilisateurs, mais ce n'est pas aussi amusant. Je voudrais savoir si l'utilisation d'un type défini par l'utilisateur dans une requête est ou n'est pas possible afin que je ne continue pas à me frapper la tête sur ce mur particulier.

Merci.

Répondre

0

Vous devez probablement le convertir au bon type. Essayez "SELECT * FROM tâches O WH (affichage = CAST ('True' AS bool))".

+0

merci, je vais essayer ça – Strider1066

1

Utilisez la méthode correcte pour passer des variables aux requêtes: Ne créez pas la requête, n'utilisez pas de points d'interrogation et transmettez les paramètres sous la forme d'un tuple à execute().

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

De cette façon, le pilote SQLite utilisera directement la valeur. Il n'est plus nécessaire d'échapper, de citer, de convertir.

Utilisez cette technique pour chaque paramètre, chaîne paire, nombre entier, etc. De cette façon, vous évitez automatiquement l'injection SQL.

+0

merci, je vais essayer ça – Strider1066