2010-09-27 3 views
3

Dans mon application Python, j'ai utilisé sqlite3.Row comme usine de ligne pour indexer les résultats par nom pendant un certain temps sans problème. Récemment, j'ai déplacé mon application sur un nouveau serveur (aucun changement de code), et j'ai découvert que cette méthode d'indexation échoue maintenant de façon inattendue sur le nouveau serveur en raison d'une condition assez spécifique. Je ne peux pas voir d'explication pour cela.Python: Comportement incohérent utilisant sqlite3.Row pour indexer dans les résultats par nom

Le problème semble se produire sur le nouveau serveur quand j'ai le mot-clé DISTINCT dans ma requête de sélection:

import sqlite3 
conn = sqlite3.connect(':memory:') 
conn.row_factory = sqlite3.Row 
c = conn.cursor() 

c.execute('create table test ([name] text)') 
c.execute("insert into test values ('testing')") 
conn.commit() 

c.execute('select [name] from test') 
row = c.fetchone() 
print row['name'] # works fine on both machines 

c.execute('select distinct [name] from test') # add distinct keyword 
row = c.fetchone() 
print row['name'] # fails on new server (no item with that key) 

Comme vous pouvez le voir, je suis en mesure de sandbox ce problème en utilisant une base de données en mémoire, donc le problème n'a rien à voir avec mes données existantes. Les deux machines sont basées sur Debian (anciennement: Ubuntu 8.10, nouveau: Debian 5.0.3) et les deux machines exécutent Python 2.5.2. Je crois que le module sqlite3 est une partie centrale de l'installation de Python, donc je ne sais pas comment cette rupture subtile peut se produire puisque les versions de python sont identiques.

Est-ce que quelqu'un a des idées ou a déjà vu quelque chose comme ça?

Merci,
Chris

+1

Il a échoué pour moi (Python 2.5.2) au début, mais maintenant je ne peux pas le reproduire avec le même code. Est-ce que ça arrive à chaque fois? Et que se passe-t-il lorsque vous passez 'detect_types = sqlite3.PARSE_COLNAMES' à l'appel' connect (": memory:"))? – AndiDog

+0

Bonne idée. J'ai juste essayé d'ajouter 'sqlite3.PARSE_COLNAMES' mais cela n'a pas aidé. Par intérêt, je viens de découvrir que si je change l'instruction select pour "sélectionner distinct [nom] comme nom de test", alors cela fonctionne - mais cela n'aide pas vraiment à m'expliquer le problème, et ne le fait pas semble être une bonne solution à mettre en œuvre. – cdlk

+0

@AndiDog aussi, si ce problème se produit de manière fiable à chaque fois. – cdlk

Répondre

1

Essayez d'ajouter la ligne

print row.keys() 

au lieu de « ligne d'impression [ « nom »] » pour voir ce que la colonne nom réel de 0 est dans le second cas (il est probablement modifié par le mot clé "DISTINCT").

Vous pouvez également utiliser la ligne [0] dans ce cas, mais ce n'est probablement pas ce que vous voulez. :)

Questions connexes