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

Python Discussion :

Problème Base donneé MSACCESS avec sqlalchemy_msacess


Sujet :

Python

  1. #1
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut Problème Base donneé MSACCESS avec sqlalchemy_msacess
    Bonjour

    Je cherche a me connecter sur une base MSACCESS avec Sqlalchemy

    Version python : 3.10
    Système ; windows


    les prérequis PIP sont présent
    • SQLAlchemy 1.4.26
    • sqlalchemy-access 1.1.1



    les prérequis windows sont :
    • une connexion odbc
    • et un paramètrage odbc sur la base MSacess en local avec le paramête ExtendedAnsiSql spécifier par la docs sqlalchemy-access


    de d'insert basic ne sont plus présente...?


    LE 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    # coding: utf-8  
    from sqlalchemy import Column, Integer, Text ,  String,  create_engine ,ForeignKey 
    from sqlalchemy.orm import scoped_session, sessionmaker, relationship
    from sqlalchemy.ext.declarative import declarative_base 
    from sqlalchemy import delete, insert , update ,  func ,select , null
     
    # Base class used by my classes (my entities)
    Base_Msaccess = declarative_base()    # Required
     
     
    class T_toto( Base_Msaccess  ):
        __tablename__ = 'toto'
        ID_TOTO =  Column(Integer, primary_key=True,  autoincrement=True) 
        Nom = Column(String(100)  )
     
     
    class T_titi( Base_Msaccess  ):
        __tablename__ = 'titi'
        ID_Titi =  Column(Integer, primary_key=True,  autoincrement=True) 
        Nom = Column(String(100)  )   
        Age =  Column(Integer, default =1)
     
     
    if __name__ == '__main__':
     
        DBSession_msacesss = scoped_session(sessionmaker())
        engine_msacess = create_engine("access+pyodbc://@RCG-base-Accss")
        Base_Msaccess.metadata.create_all(engine_msacess)      # uniquement à la creation installe les tables
        DBSession_msacesss.remove()
        DBSession_msacesss.configure(bind=engine_msacess, autoflush=False, expire_on_commit=False)
     
     
        Base_Msaccess.metadata.drop_all(engine_msacess)
        Base_Msaccess.metadata.create_all(engine_msacess)
     
     
        stmt = (insert(T_toto).values(Nom ='toto1'))
     
        try:
            DBSession_msacesss.execute(stmt)
        except  Exception as erreur:
            print(erreur)
        stmt = (insert(T_titi).values(Nom ='lou',Age=9))
     
        try:
            DBSession_msacesss.execute(stmt)
        except  Exception as erreur:
            print(erreur)
    voici le message que j'obtiens


    cursor.execute(statement, parameters)
    sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('HY000', '[HY000] [Microsoft][Pilote ODBC Microsoft Access] Impossible d’ouvrir la base de données «\xa0|\xa0».
    Ce n’est peut-être pas une base de données que votre application reconnaît, ou le fichier est peut-être endommagé. (-1206) (SQLExecDirectW)')
    [SQL:
    DROP TABLE toto]
    (Background on this error at: https://sqlalche.me/e/14/dbapi)


    Le plus curieux est que si je cherche a créer la table toto via sql avec DBeaver ; j'ai une erreur pour table existante... Mais la table n'est pas dans la liste .
    Si le regarde avec le logiciel msAcess de windowe la table existe.
    il semble que sqlalchmemy cherche a détruire la table alors que celle-ci existe hors sur d'autre utlisation d'SQL alchemy si la table existe le processus ne cherche pas à la détruire...???

  2. #2
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut autre test
    Je supprime de mon code la table toto.
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    # coding: utf-8  
    from sqlalchemy import Column, Integer, Text ,  String,  create_engine ,ForeignKey 
    from sqlalchemy.orm import scoped_session, sessionmaker, relationship
    from sqlalchemy.ext.declarative import declarative_base 
    from sqlalchemy import delete, insert , update ,  func ,select , null
     
    # Base class used by my classes (my entities)
    Base_Msaccess = declarative_base()    # Required
     
    """
    class T_toto( Base_Msaccess  ):
        __tablename__ = 'toto'
        ID_TOTO =  Column(Integer, primary_key=True,  autoincrement=True) 
        Nom = Column(String(100)  )
    """   
     
    class T_titi( Base_Msaccess  ):
        __tablename__ = 'titi'
        ID_Titi =  Column(Integer, primary_key=True,  autoincrement=True) 
        Nom = Column(String(100)  )   
        Age =  Column(Integer, default =1)
     
     
    if __name__ == '__main__':
     
        DBSession_msacesss = scoped_session(sessionmaker())
        engine_msacess = create_engine("access+pyodbc://@RCG-base-Accss")
        Base_Msaccess.metadata.create_all(engine_msacess)      # uniquement à la creation installe les tables
        DBSession_msacesss.remove()
        DBSession_msacesss.configure(bind=engine_msacess, autoflush=False, expire_on_commit=False)
     
     
        Base_Msaccess.metadata.drop_all(engine_msacess)
        Base_Msaccess.metadata.create_all(engine_msacess)
     
        """
        stmt = (insert(T_toto).values(Nom ='toto1'))
     
        try:
            DBSession_msacesss.execute(stmt)
        except  Exception as erreur:
            print(erreur)
        """
     
        stmt = (insert(T_titi).values(Nom ='lou',Age=9))
     
        try:
            DBSession_msacesss.execute(stmt)
        except  Exception as erreur:
            print(erreur)
     
     
        ID_Titi = DBSession_msacesss.execute(select(T_titi.ID_Titi).where(T_titi.Nom ==   'lou')).first()[0]
     
        print(ID_Titi)
    Le print renvoi 1 donc la cle suppose du la donnée.
    je relance le programme j'ai toujours ce même résultat ce qui veux dire que ' Base_Msaccess.metadata.create_all(engine_msacess) ' drop les table ce qu'il ne fait pas avec d'autre base....
    Le programme ce termine sans erreur

    mais si je regarde en base avec dbeaver ou msacess , pas de trace des données dans titi.....

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par dedalios Voir le message
    mais si je regarde en base avec dbeaver ou msacess , pas de trace des données dans titi.....
    sqlalchemy ne fera pas un commit à votre place...

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

  4. #4
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    Si sqlalchemy ne faits pas le commit a ma place comme expliquer que la création de la base ce réalise?

    Mais effectivement l'ajout du commit règle le problème, je l'avais supprimer car dans un premier temps j'avais obtenue une erreur ou le processus m'avait dit que la base était en autocommit....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            finally:
                DBSession_msacesss.commit()

    IL me faut aussi supprimer les lignes qui font le ménage dans la base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        # drop et recrert tous les tables
        Base_Msaccess.metadata.drop_all(engine_msacess)
        Base_Msaccess.metadata.create_all(engine_msacess)
    Pour autant cela n'explique en rien le problème du drop impossible sur la table toto, semble qu'il soit impossible de détruire cette table .....

    sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('HY000', '[HY000] [Microsoft][Pilote ODBC Microsoft Access] Impossible d’ouvrir la base de données «\xa0|\xa0».
    Ce n’est peut-être pas une base de données que votre application reconnaît, ou le fichier est peut-être endommagé. (-1206) (SQLExecDirectW)')
    [SQL:
    DROP TABLE toto]
    (Background on this error at: https://sqlalche.me/e/14/dbapi)

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Si sqlalchemy ne faits pas le commit a ma place comme expliquer que la création de la base ce réalise?
    Créer et détruire des tables n'est pas géré comme transaction (c'est expliqué dans la documentation).

    Citation Envoyé par dedalios Voir le message
    Mais effectivement l'ajout du commit règle le problème, je l'avais supprimer car dans un premier temps j'avais obtenue une erreur ou le processus m'avait dit que la base était en autocommit....
    Faire feu de tout bois jusqu'à ce que ça veuille bien tomber en marche?

    Citation Envoyé par dedalios Voir le message
    Pour autant cela n'explique en rien le problème du drop impossible sur la table toto, semble qu'il soit impossible de détruire cette table .....
    Je ne vais pas me prendre le chou à installer le tas de packages requis pour essayer de reproduire le problème...

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

  6. #6
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut Problème ODBC Source de données introuvable et nom de pilote non spécifié (0) (SQLDriverConnect)')
    bonjour

    JE viens d'installer une nouvelle machine, lorsque je lance ce code python qui fonctionne par ailleurs sur une autre machine

    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
    # coding: utf-8
    import pyodbc 
     
    try :
     
        connStr = (
        r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
        r"DBQ=D:\eclipse-workspace\RIFT\Base\rcg.mdb;"
        )
     
        cnxn = pyodbc.connect(connStr)
     
     
        cursor = cnxn.cursor()
        print("-----------")
        cursor.execute('SELECT * FROM Bionics')
     
        row = cursor.fetchall()
        if row :
            print(row, '\n')  
     
    except  Exception as erreur:
        print("Erreur:" , erreur)
     
    finally:    
        print("")
        pass
    j'obtiens ce message.

    Erreur: ('IM002', '[IM002] [Microsoft][Gestionnaire de pilotes ODBC] Source de données introuvable et nom de pilote non spécifié (0) (SQLDriverConnect)')
    Ce message est habituellement obtenu si la référence à la base msacces est erronée "D:\eclipse-workspace\RIFT\Base\rcg.mdb" mais j'ai bien la base dans ce répertoire?
    De plus odbc 32 et 64 bit on bien une source ms access Database?
    je viens même d'ajouter une source de données spécifique qui pointe sur la base MS access .
    et je peux consulter la base avec des outils de consultation telque dbeaver ?

    pyodbc version 4.0.32 est installé?


    je peux eventuellement installer les versions 8.0.27 d' Odbc mais l’à-propos dit qu' ODBC est en version 10.0.19041.1
    mysql-connector-odbc-8.0.27-winx64
    mysql-connector-odbc-8.0.27-win32

  7. #7
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut résolue
    A priori il manquait un module peu être pywin32 pour l'interprétation des répertoires au format window tel que 'D:\eclipse-workspace'

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. gestion de la base données mysql avec hibernate impossible
    Par douaa.flower dans le forum Hibernate
    Réponses: 5
    Dernier message: 18/04/2011, 15h04
  2. [Joomla!] Problème Base donnée externe à Joomla
    Par matxu dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 09/12/2009, 20h13
  3. [MySQL] probleme de replication de base donnée mysql avec php
    Par christclamard dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/02/2008, 20h42
  4. [ODBC] Base données AS400 avec easyphp
    Par hkpsyco dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/06/2006, 12h27

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