2015-04-06 3 views
0

J'utilise le module sqlite3 dans Python 3 pour travailler avec SQLite.Paramètres facultatifs dans une instruction SQLite SELECT

J'ai une instruction SELECT qui peut s'exécuter avec un nombre varié de paramètres en fonction de l'entrée de l'utilisateur. Par exemple, si aucun paramètre est fourni par l'utilisateur, l'instruction est tout simplement:

SELECT * FROM TestTable WHERE User=?

où l'ID de chaque utilisateur est connu par défaut.

D'autre part, si un ou plusieurs paramètres sont fournis par l'utilisateur pour affiner la sélection, la déclaration peut devenir quelque chose comme:

SELECT * FROM TestTable WHERE User=? AND ColA=? AND ColB=?

Pour gérer ce type d'entrée utilisateur variée, est il existe une manière native dans SQLite de prendre en charge les paramètres facultatifs dans les instructions SELECT? Ou je ai juste besoin de générer par programmation la chaîne SQL appropriée en utilisant Python d'abord basé sur l'entrée de l'utilisateur, puis d'utiliser la chaîne dérivée pour exécuter le SQL?

+0

Oui, vous devez créer 'SQL CHAINE' – itzMEonTV

+0

http://www.sqlalchemy.org/ – davidism

Répondre

1

Il serait possible de définir les paramètres inutilisés à NULL, et vérifier que dans la requête:

sql = "SELECT ... WHERE User=?1 AND (?2 IS NULL OR ColA=?2) ..." 
cursor.execute(sql, [user, a_or_null]) 

Cependant, cela fait la requête à la fois complexe et lent à exécuter.

Il serait plus facile de construire la chaîne de requête dynamique:

sql = "SELECT ... WHERE User=?" 
params = [user] 
if a_is_specified: 
    sql += " AND ColA=?" 
    params += [a] 
... 
cursor.execute(sql, params)