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
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
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
@AndiDog aussi, si ce problème se produit de manière fiable à chaque fois. – cdlk