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 :

Oracledb python sqlalchemy


Sujet :

Python

  1. #1
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    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 : 493
    Points : 152
    Points
    152
    Par défaut Oracledb python sqlalchemy
    Je cherche a utiliser sqlalchemy avec une base Oracle et quelques soit le pilote cx-Oracle ou oracledb je me heurte à des problèmes de connexion. , j'ai pu utiliser sqlcodagen-v2 pour générer les class des tables , mais quand as utilise le résultat je suis systématiquement bloqué par l absences de Tnsora qui n' ai pas utiliser par sqlcodagen-v2 pour générer la mapping de la base

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 808
    Points : 7 086
    Points
    7 086
    Par défaut
    Bonjour,

    Vous ne présentez pas de code python et je ne vois rien en relation avec le langage !
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 107
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 107
    Points : 1 611
    Points
    1 611
    Par défaut
    Si tu as eu des problèmes de connexions, il faut lire ces messages d'erreurs pour en comprendre la raison.
    Probablement, des accès/autorisations limités par les paramètres de la base Oracle pour l'utilisateur défini; ce qui se règle dans la base elle-même.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    Un fichier tnsnames.ora contient des entrées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <alias> = (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = <ip>)(PORT = <port>))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = <dbname>)
        )
      )
    Pour votre besoin vous n'avez besoin que d'une seule définition, vous mettez ce que vous voulez pour <alias>,
    les autres paramètres (les <...>) vous devez les connaitre si vous avez pu vous connectez avec un autre outil.

  5. #5
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    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 : 493
    Points : 152
    Points
    152
    Par défaut
    Lorsque j utilise cx-Oracle sans la couche alchemy, je n'ai jamais de problème ,et j'en utilise pas de tnsname .
    Je vais mettre le message d erreur dans la journée et le paramétrage. L utilisation des tnsname suppose de plus une couche application qui n'est pas installée.
    Donner uniquement la structure de ce type de fichier sans explication de son mode d’utilisation me semble sans grande utilité.

  6. #6
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    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 : 493
    Points : 152
    Points
    152
    Par défaut
    Voici les trois solutions Testé


    La partie commune
    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
    from sqlalchemy import CHAR, Column, DateTime, ForeignKeyConstraint, Index, MetaData, PrimaryKeyConstraint, TIMESTAMP, Table, VARCHAR
    from sqlalchemy.dialects.oracle import NUMBER
    from sqlalchemy.orm.base import Mapped
    from dataclasses import dataclass
    from sqlalchemy import create_engine, MetaData, Table, select , text
     
    from sqlalchemy import create_engine
    from sqlalchemy.orm import Session
     
     
    metadata = MetaData()
     
     
    t_livre = Table(
        'livre', metadata,
        Column('idlivre', NUMBER(8, 0, False)),
        Column('ReferenceLivre', VARCHAR(12), nullable=False),
        Column('idBib', NUMBER(8, 0, False), nullable=False),
        Column('titre', VARCHAR(250), nullable=False),
        Column('Idauteur',  NUMBER(8, 0, False), nullable=False),
        Column('dtcreation', DateTime),
        Column('dtpublication', DateTime),
        PrimaryKeyConstraint('idlivre', name='pk_idlivre'),
        Index('ReferenceLivre', 'idBib', 'Idauteur')
    )
     
    @dataclass
    class Iduser:
        user: str = None
        passw: str = None
        serveur: str = None
        port: str = None
        nom_de_service: str = None
     
     
        def id_cx_oracle(self):
            idcon = f'oracle+cx_oracle://{self.user}:{self.passw}@{self.serveur}:{self.port}/?service_name={self.nom_de_service}'
            return idcon
     
        def id_oracledb(self):
            idcon = f'oracle+oracledb://{self.user}:{self.passw}@{self.serveur}:{self.port}/?service_name={self.nom_de_service}'
            return idcon
     
     
    if __name__ == '__main__':
        connexion_pass = Iduser(user='mon utilisateur', passw='le mot de passe', serveur='mon serveur', port='Numero de port', nom_de_service=' service name')
    La solution fonctionnel a base de python sqlalchemy -cx_oracle

    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
        # Seul solution fonctionnnel  
        # Créez le moteur SQLAlchemy avec le pool de connexions python sqlalchemy -cx_oracle
        # prérequis il faut avec  cx_oracle d'installer 
        engine = create_engine(f'{connexion_pass.id_cx_oracle()}')
     
     
        # create session and add objects
        with Session(engine) as session:
     
            # Exemple d'extraction de données
            leslivres = session.query(t_livre).all()
     
            for unlivre in leslivres:
                print(f'ID:{unlivre.idlivre}--> {unlivre.ReferenceLivre}')
     
            session.commit()
    Documentation https://docs.sqlalchemy.org/en/20/di...racle.oracledb

    Exemples de la documentation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from sqlalchemy import create_engine
    sync_engine = create_engine("oracle+oracledb://scott:tiger@localhost/?service_name=XEPDB1")
     
    from sqlalchemy.ext.asyncio import create_async_engine
    asyncio_engine = create_async_engine("oracle+oracledb://scott:tiger@localhost/?service_name=XEPDB1")
    Test des deux solutions :
    prérequis il faut avec oracledb d'installer

    Test N°1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       from sqlalchemy.ext.asyncio import create_async_engine
         # Créez le moteur SQLAlchemy avec le pool de connexions python-oracledb
        engine = create_async_engine(f'{connexion_pass.id_oracledb()}')
     
        # create session and add objects
        with Session(engine) as session:
     
            # Exemple d'extraction de données
            leslivres = session.query(t_livre).all()
     
            for unlivre in leslivres:
                print(f'ID:{unlivre.idlivre}--> {unlivre.ReferenceLivre}')
     
            session.commit()
    Résultat de test erreur généré : sqlalchemy.ext.asyncio.exc.AsyncContextNotStarted: AsyncConnection context has not been started and object has not been awaited.

    version N° 2 plus classique similaire a cx_oracle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        from sqlalchemy.ext.asyncio import create_async_engine
     
        # Créez le moteur SQLAlchemy avec le pool de connexions python-oracledb
        engine = create_engine(f'{connexion_pass.id_oracledb()}')
        # create session and add objects
        with Session(engine) as session:
     
            # Exemple d'extraction de données
            leslivres = session.query(t_livre).all()
     
            for unlivre in leslivres:
                print(f'ID:{unlivre.idlivre}--> {unlivre.ReferenceLivre}')
     
            session.commit()
    résultat une erreur
    raise exc_type(_Error(message)) from cause

    sqlalchemy.exc.NotSupportedError: (oracledb.exceptions.NotSupportedError) DPY-3015: password verifier type 0x939 is not supported by python-oracledb in thin mode
    Help: https://python-oracledb.readthedocs.....html#dpy-3015
    (Background on this error at: https://sqlalche.me/e/20/tw8g)

    Pour cette partie Upgrade your Oracle database to python-oracledb Thin mode supported versions 12.1 or later.
    je pense que le problème est lié a la version de base oracle

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 107
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 107
    Points : 1 611
    Points
    1 611
    Par défaut
    Tu as une réponse dans le lien d'aide (https://python-oracledb.readthedocs.....html#dpy-3015) , on te donne 2 solutions possibles.

    Si tu as une version d'oracle qui ne supporte pas le vérificateur 11G, tu peux continuer d'utiliser cx_Oracle (a priori tu indiques que ça fonctionne si j'ai bien lu, ou j'ai raté le message d'erreur).

    Si ta version d'Oracle est trop vieille, il faut aussi sans doute revenir à des versions plus anciennes et compatibles des bibliothèques sqlachemy et/ou cx_Oracle.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356

  9. #9
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    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 : 493
    Points : 152
    Points
    152
    Par défaut
    J'ai regardé les compléments, car c'est une base Oracle 12C.

    Malheureusement, les 2 solutions présentes ne peuvent être applicables qu'à certaines conditions qui supposent des niveaux d’accès particuliers qui ne sont pas toujours accessibles pour de questions de sécurité.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/02/2023, 10h18
  2. Python et PostgreSQL a partir de SQLAlchemy
    Par calito dans le forum Général Python
    Réponses: 3
    Dernier message: 26/09/2014, 13h05
  3. [python 2,6] [sqlite3] (sqlAlchemy?)
    Par antoinev2 dans le forum Général Python
    Réponses: 12
    Dernier message: 02/10/2009, 00h05
  4. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 12h32
  5. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59

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