IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaçage autre langage Python Discussion :

pyodbc et une base MS Access 97


Sujet :

Interfaçage autre langage Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 34
    Points : 33
    Points
    33
    Par défaut pyodbc et une base MS Access 97
    Bonjour,
    j'essaye de remplacer un vieux programme VB6 en Python qui met à jour une table dans une vielles base MSACCESS 97 (cette base est utilisé dans un outil propriétaire dont nous n'avons pas les sources... nous sommes un peu bloqué avec cette très vieilles version...), le but est de supprimer tous les enregistrement d'une table CLIENT et de refaire des INSERT des nouvelles valeurs ainsi seuls les clients actifs sont présents.

    je suis sous linux avec pyODBC et le driver MSACCESS MDB 0.7.1

    J'arrive à me connecter sans erreur à la base Access97, voici un extrait de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    # -*- coding: utf-8 -*-
    # Python 3.7 2020-02-28
     
    import os
    import datetime
    import time
    import sys
    import pyodbc
     
    ...
    def MajTableMSAccess(cheminMdb):
        try:
            cnxMSAccess = pyodbc.connect('Driver={MDB 0.7.1};DBQ=' + cheminMdb + ';Uid=Admin;Pwd=;',ansi=True)
        except Exception as inst:
            print("{0} Error : {1} ".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M"),sys.exc_info()[0]))
            print(type(inst))
            print(inst.args)
        else:
            cnxMSAccess.setdecoding(pyodbc.SQL_CHAR, encoding='iso-8859-1') 
            cnxMSAccess.setdecoding(pyodbc.SQL_WCHAR, encoding='iso-8859-1') 
            cnxMSAccess.setencoding(encoding='iso-8859-1')
            curR = cnxMSAccess.cursor()
            print("{0} Connexion MSAccess {1} OK".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M"),cheminMdb))
            #curR.execute('Select * from CLIENT')
            #rows = curR.fetchall()
            #print("{0} requete MSAccess {1} OK".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M"),'Select * from CLIENT_GPAO'))
            try: 
                #curR.execute('DELETE FROM CLIENT')
                curR.execute('TRUNCATE TABLE CLIENT')
                print("{0} Table {1} -> CLIENT  => Delete OK...".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M"),cheminMdb))
            except Exception as inst:
                print("{0} Error : {1} ".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M"),sys.exc_info()[0]))
                print(type(inst))
                print(inst.args)
            finally:
                curR.close()
                cnxMSAccess.close()
    ...
    Pour arriver à exécuter le SELECT (mis en commentaire, je n'ai pas besoin de lister la table), j'ai trouver en farfouillant sur le net qu'il fallait ajouter : cnxMSAccess.setdecoding(pyodbc.SQL_CHAR, encoding='iso-8859-1') cnxMSAccess.setdecoding(pyodbc.SQL_WCHAR, encoding='iso-8859-1') et cnxMSAccess.setencoding(encoding='iso-8859-1') et effectivement ça a fonctionné.

    j'ai donc mis mes lignes du SELECT en commentaire en me disant "super je peux me connecter et lancer une requête SELECT tout est OK" ... Mais non ...
    dès que j'ai mis la requête curR.execute('DELETE FROM CLIENT') puis curR.execute('TRUNCATE TABLE CLIENT') (j'ai essayé avec ou sans ";" en fin de requête ... toujours la même anomalie :
    syntax error near DELETE
    Got no result for 'DELETE FROM CLIENT' command
    [08001] Couldn't parse SQL\n (1) (SQLExecDirectW)
    ou
    syntax error near TRUNCATE
    Got no result for 'TRUNCATE TABLE CLIENT' command
    [08001] Couldn't parse SQL\n (1) (SQLExecDirectW)
    j'ai trouvé plusieurs cas avec la même erreur sur des SELECT avec des erreurs de syntaxe dans la commande SQL, mais là je ne vois pas ce qui gêne dans 'DELETE FROM CLIENT' ou 'TRUNCATE TABLE CLIENT'.
    je ne sais pas si le problème n'est pas comme pour le SELECT un pb de transcodage entre l'Unicode de Python et le latin-1 de MSACCESS, mais je ne sais pas quoi mettre comme option, je pensais que les 3 commandes setencoding corrigeaient tous les pb de tranco en entrée comme en sortie ...
    Si quelqu'un a une idée pour me dépatouiller... et je n'ai pas encore testé les INSERT ...

    Merci d'avance.
    Cordialement,
    Alain

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 34
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    Je pense avoir un début de réponse sur l'erreur :
    j'ai demandé plus d'information à l'administrateur Linux de ma boite comment il avait installé le driver MDB : il a trouvé, répondant à ma demande (acceder depuis Python/pyodbc à une base MSAccess 32bits version 97), que MDBTools qui installe un driver MSAccess compatible avec la version 97, qu'il a nommé : "MDB 0.7.1" dans /etc/odbcinst.ini et qui pointe sur le driver /usr/local/lib/libmdbodbc.so.

    Quand j'ai cherché la doc de MDBTools... les seules requêtes implémentées sont les SELECT simple sans jointure ... rien d'autre ...
    Donc normal que le "Delete" ou le "truncate" plante, ils ne sont pas implémenté dans le driver ... super je ne peux que lire...
    et pas non plus la possibilité d'INSERT juste un import csv pour un simili "bulk insert" de sql server, et impossible de supprimer la moindre ligne et comme mon but est de vider la table pour la re-remplir avec les clients (anciens et nouveaux) => ça évite de choisir entre insert, update, delete ou ne rien faire, surtout que la table fait moins de 2000 lignes ...

    Donc ma question devient : est-ce que quelqu'un connait un driver ODBC compatible avec MSAccess 97/2003 pour lire et écrire dans une des tables à installer sur un LINUX 64bits ?

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par nazzguhl Voir le message
    est-ce que quelqu'un connait un driver ODBC compatible avec MSAccess 97/2003 pour lire et écrire dans une des tables à installer sur un LINUX 64bits ?
    Pas sûr que le forum Python soit le meilleur endroit pour avoir des réponses à ce genre de question.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Python connexion a une base Access
    Par Darkerthandark dans le forum Général Python
    Réponses: 5
    Dernier message: 27/11/2017, 22h32
  2. [2008] Requête SQL sur une base de données en python
    Par noramokh dans le forum Développement
    Réponses: 2
    Dernier message: 16/02/2015, 17h02
  3. Interaction avec une base de données MySQL via python
    Par ismaeldndaw dans le forum Général Python
    Réponses: 2
    Dernier message: 01/09/2012, 15h45
  4. management studio attacher une base, probleme accés web
    Par nicorem dans le forum Administration
    Réponses: 3
    Dernier message: 03/10/2008, 10h57
  5. Accéder à une base MySQL 'distante' via Python
    Par tse_tilky_moje_imja dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 24/07/2006, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo