2010-09-29 5 views
0

J'ai une liste de ints que je veux rejoindre dans une chaîneJoignez-vous à la liste des chaînes en Python avec le remplacement de chaîne%

ids = [1,2,3,4,5] 

qui ressemble à « Id = 1 ou Id = 2 ou Id = 3 ou Id = 4 ou ID = 5'

J'ai une réponse maintenant, mais je pensais que ce peut être bon pour obtenir l'avis du groupe

Edit: Plus d'informations sur les sayers ... Cela ne générer directement SQL, c'est l'expression dynamique t hat est envoyé à une couche de services de données Ado.net qui utilise Entity Framework sous. La clause IN qui est ce qui est préféré n'est pas encore supportée par le gestionnaire d'expression dynamique/adaptateur EF4 dans le service et je dois pour le moment avoir recours à plusieurs instructions égales.

+0

Juste au hasard vous essayez de faire ce que je pense que vous faites, vous pouvez dire 'id in ids' en python. Il retourne true si 'id' apparaît dans la liste' ids'. – JoshD

+0

-1: A propos de la seule utilisation pour cela est la génération de SQL dynamique. Une très, très mauvaise chose à faire. –

Répondre

4
" or ".join("id = %d" % id for id in ids) 
+0

sur ma machine, en remplaçant l'ancien style de mise en forme avec un nouveau style le fait tomber de 14usec à 9.3usec. Bien sûr ce n'est toujours pas aussi bon que 7,34 usecs que vous obtenez en évitant le formatage des chaînes;) – aaronasterling

+0

@arron - pourriez-vous élaborer –

+0

Il parle de '" id =% d "% id' vs' "id = {}" .format (id) '(ancien contre nouveau). – snapshoe

1
mystring = 'id =' + 'or id ='.join(str(i) for i in ids) 

Si vous voulez générer sql dynamique que ceux dans les commentaires ont fait remarquer (ne sais pas comment je l'ai raté), vous devriez faire cela comme

mystring = ' or '.join(['id = ?']*len(ids)) 

? est destiné à être remplacé par la séquence d'échappement appropriée pour votre bibliothèque de base de données. Pour sqlite3, c'est ?. pour MySQLdb, il utilise les codes printf, IIRC. Vous pouvez ensuite passer la liste des ID au curseur en tant que second argument (généralement) après la chaîne sql et les y placer de manière sécurisée. C'est toujours la bonne chose.

+0

Merci, ce n'est pas dynamique au sens standard, c'est plutôt une expression de prédicat qui est envoyée à un service ADO.NET Data Services (OR4 ORM en dessous). –

Questions connexes