Je travaille sur un programme permettant d'automatiser l'analyse de données à partir de fichiers XML et de les stocker dans plusieurs bases de données. (Plus précisément, le service de qualité de l'eau en temps réel de l'USGS, si quelqu'un est intéressé, au http://waterservices.usgs.gov/rest/WaterML-Interim-REST-Service.html) Il est écrit en Python 2.5.1 en utilisant LXML et PYODBC. Les bases de données sont dans Microsoft Access 2000.Les requêtes SQL via PYODBC échouent silencieusement sur une machine, fonctionne sur une autre
La fonction de connexion est la suivante:
DEF get_AccessConnection (db):
connString = 'DRIVER = {Microsoft Access Driver (* .mdb)}; DBQ =' + db
cnxn = pyodbc.connect (connString, autocommit = Faux)
curseur = cnxn.cursor()
retour cnxn, le curseur
où db est le chemin du fichier de la base de données.
Le programme:
a) ouvre la connexion à la base de données
b) parse 2 à 8 fichiers XML pour cette base de données et construit les valeurs de leur part dans une série d'enregistrements à insérer dans la base de données (en utilisant un imbriquée la structure du dictionnaire, pas un type défini par l'utilisateur)
c) une boucle à travers la série d'enregistrements, cursor.execute() - ing une requête SQL pour chacun
d) engage et ferme la connexion de base de données
Si le L'appel cursor.execute() renvoie une erreur, écrit la traceback et la requête dans le fichier journal et continue.
Lorsque mon collègue l'exécute sur sa machine, pour une base de données particulière, des enregistrements spécifiques ne seront tout simplement pas là, sans erreurs enregistrées. Lorsque je cours exactement le même code sur exactement la même copie de la base de données sur exactement le même chemin réseau de ma machine, toutes les données qui devraient être là sont là. Mon collègue et moi sommes tous deux sur des ordinateurs Windows XP avec Microsoft Access 2000 et les mêmes versions de Python, lxml et pyodbc installées. Je n'ai aucune idée comment vérifier si nous avons la même version des pilotes Microsoft ODBC. Je n'ai pas pu trouver de différence entre les enregistrements qui sont là et ceux qui ne le sont pas. Je suis en train de tester si le même problème se produit avec les autres bases de données, et si cela arrive aussi sur l'ordinateur d'un troisième collègue. Ce que j'aimerais vraiment savoir, c'est n'importe quoi que n'importe qui peut penser à cela, parce que cela n'a pas de sens pour moi. Pour récapituler: Le code Python exécutant des requêtes SQL échouera silencieusement la moitié d'entre eux sur un ordinateur et fonctionnera parfaitement sur un autre.
Éditer:
Plus aucun problème. Je viens de faire exécuter à nouveau mon collègue, et la base de données a été complètement mise à jour sans aucun enregistrement manquant. Toujours pas d'idée pourquoi il a échoué en premier lieu, ni si cela va se reproduire ou non, mais "problème résolu".
Est-ce que ça fait la différence sans 'autocommit'? Access n'est pas une base de données transactionnelle donc certainement 'autocommit = False' ne peut pas être honoré. Toutes mes expériences de parler à Access via des scripts avec ODBC ont été absolument horribles (se bloque, etc). Vous pouvez essayer ADO qui est au moins moins mauvais ... idéalement, bien sûr, l'accès doit disparaître. – bobince
Je n'avais aucune idée L'accès n'était pas transactionnel. Il s'est certainement comporté comme tel - si je n'appelais pas cnxn.commit() pendant que je testais le programme, aucune modification des bases de données ne persisterait. Je préfère ne pas changer autocommit si possible. Je ne veux pas de bases de données à moitié finies si une erreur inattendue et non gérée survient. – Rowan
@Rowan: Ceci est attendu, Access attend de faire quoi que ce soit jusqu'à ce que vous lui disiez de commettre - de cette façon, il "honore" la transaction. :(-> Accès – Hogan