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:…
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 !
@+
Ravi d’avoir pu aider !
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 ?
Les « findBy » fonctionnent bien par contre je n’ai pas testé avec les « findOneBy »…
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
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