Doctrine ORM 1.2 et OCI8…

En programmant... 11 mars 2011

Doctrine, c’est top…
Un outil quasi-automatique qui arriverait presque à supprimer la notion de SQL dans une application…

Il génère son fichier de configuration, les classes des modèles et fait aussi le café.
Dix caractères de configuration, trois lignes de commande et ça tourne…

Enfin, en général…

Car Doctrine se présente comme une surcouche de l’interface d’abstraction de bases de données PDO.
Mais quand on travaille avec Oracle, il arrive parfois que l’on ne puisse pas utiliser l’extension PDO_OCI en raison de son statut expérimental.

La chaîne de connexion suivante devient alors un doux rêve :

oci:dbname=//<ip>:<port>/<db_name>

Heureusement, et il faut fouiller dans les classes pour le voir, Doctrine possède un adapter pour Oracle qui utilise la fameuse extension OCI8.
Plusieurs syntaxes sont acceptées par cette classe.

Avec le couple IP/SID, par exemple :

oracle:dbname=//<ip>:<port>/<sid>

Ou encore en utilisant un TNSNAME configuré sur la machine :

oracle:dbname=<tns_name>

Les chaînes de connexions peuvent être complétées avec les paramètres habituels (charset, etc.).
L’important étant de conserver le mot clé oracle:

6 commentaires

  1. Florian dit :

    Merci beaucoup !
    Je me voyais mal recréer un Adapter pour utiliser la librairie Oci8 plutôt que Pdo_Oci..

    En changeant un seul mot, j’ai réglé tous mes problèmes de CLOB !

    @+

  2. Aurélien dit :

    Ravi d’avoir pu aider !

  3. ffrey dit :

    Je suis en train de tester avec ‘oracle’ comme dit dans l’article.
    J’arrive à faire des requêtes avec « Doctrine_Query::create() ». Par contre, les methodes magique « find » (findOneBy(), etc.) ne fonctionnent pas. Elles renvoient l’erreur  » oci_fetch_array(): 1533 is not a valid oci8 statement resource ».
    As-tu le même souci ?

  4. Aurélien dit :

    Les « findBy » fonctionnent bien par contre je n’ai pas testé avec les « findOneBy »…

  5. Eric dit :

    Bonjour,

    Personnellement, je n’arrive pas à faire fonctionner le
    oracle:dbname=

    il n’est pas reconnu dans la section doctrine. Je le met par défaut dans la section parameters mon tnsname est nommé « tnsnames.ora ».

    J’ai essayé les syntaxes suivantes :
    oracle:dbname=tnsnames.ora
    oracle:dbname=/path/.xx./.xx./tnsnames.ora

    cela ne résouts pas mon problème, j’ai encapsulé avec des quotes mais cela ne change rien, je n’arrive pas à trouver la syntaxe ou dans quel endroit pour que cela fonctionne

    1. Eric dit :

      Voilà la config qui marche :
      doctrine.yaml
      parameters:
      # Adds a fallback DATABASE_URL if the env var is not set.
      # This allows you to run cache:warmup even if your
      # environment variables are not available yet.
      # You should not need to change this value.
      env(DATABASE_URL):  »

      database_user: ‘%env(USER_ORACLE_MONAPPLI)%’
      database_password: ‘%env(PWD_ORACLE_MONAPPLI)%’
      database_servicename: ‘%env(ALIAS_MONAPPLI)%’

      doctrine:

      dbal:
      # configure these for your database server
      driver: ‘oci8’
      server_version: ‘5.7’
      charset: utf8
      default_table_options:
      charset: utf8
      collate: utf8_unicode_ci
      host: ~
      dbname: ‘%database_servicename%’
      servicename: ‘%database_servicename%’
      user: ‘%database_user%’
      password: ‘%database_password%’

      schema_filter: ~^(MA_TABLE)$~
      orm:
      auto_generate_proxy_classes: ‘%kernel.debug%’
      naming_strategy: doctrine.orm.naming_strategy.underscore
      auto_mapping: true
      mappings:
      App:
      is_bundle: false
      type: annotation
      dir: ‘%kernel.project_dir%/src/Entity’
      prefix: ‘App\Entity’
      alias: App

Répondre à Aurélien Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *