J'utilise pyodbc, via Microsoft Jet, pour accéder aux données d'une base de données Microsoft Access 2003 à partir d'un programme Python.PyODBC et Microsoft Access: Résultats incohérents d'une requête simple
La base de données Microsoft Access provient d'un tiers; Je ne fais que lire les données.
J'ai généralement réussi à extraire les données dont j'ai besoin, mais j'ai récemment remarqué quelques divergences.
J'ai fait bouillir vers le bas à une simple requête, de la forme:
SELECT field1 FROM table WHERE field1 = 601 AND field2 = 9067
J'ai obscurcie les noms des champs et des valeurs, mais vraiment, il ne va pas beaucoup plus trivial que cela! Lorsque j'exécute la requête dans Access, il renvoie un enregistrement.
Puis je l'exécuter sur pyodbc, avec le code qui ressemble à ceci:
connection = pyodbc.connect(connectionString)
rows = connection.execute(queryString).fetchall()
(Encore une fois, il ne va pas beaucoup plus trivial que ça!)
La valeur de queryString est coupée -et-collé à partir de la requête de travail dans Access, mais il renvoie aucun enregistrements. Je m'attendais à ce qu'il retourne le même disque.
Lorsque je change la requête pour rechercher une valeur différente pour field2, bingo, cela fonctionne. Ce sont seulement certaines valeurs qu'il rejette.
Alors, aidez-moi s'il vous plaît. Où devrais-je regarder pour expliquer cette divergence? Si je ne peux pas faire confiance aux résultats de requêtes triviales, je n'ai aucune chance sur ce projet!
Mise à jour: Cela devient encore plus simple! La requête suivante donne des chiffres différents ...
SELECT COUNT (*) FROM table
je médite si elle est liée à une certaine forme de mise en cache et/ou une mauvaise gestion des transactions par une autre application que, parfois, à des données renseigne la .
Si vous avez un objet curseur là-bas pour exécuter la chaîne de requête? Fetchall serait alors appelé sur le curseur pour produire des lignes. Voir http://code.google.com/p/pyodbc/wiki/Rows – barrowc
@barrowc, Intéressant. Je n'ai pas remarqué l'absence d'un appel de curseur(). Je suis sûr que j'ai copié ceci d'un exemple quelque part. J'ai essayé de l'ajouter dans [rows = connection.cursor(). Execute (queryString) .fetchall()] mais cela ne faisait aucune différence - apparemment pyodbc est plus tolérant que la spécification de l'API DB Python. – Oddthinking