Ruby On Rails et Oracle #1 : les problèmes de connexion
Par Renaud Gaudin le dimanche 20 mai 2007, 22:43 - RoR - Lien permanent
il s'agissait pour moi de valider la connectivité depuis un programme ruby vers une base Oracle. Les deux applis sont sur deux machines distinctes histoire de ne pas faire tout en localhost (et pourquoi pas de faire fonctionner InstantRails plus tard sur le même principe de deux machines) .
D'ici quelques jours je déploie un cookbook. À suivre!
Oracle® Database Express Edition Getting Started Guide 10g Release 2 (10.2)
Oracle Database 10g Express Edition: Not Just for Learners
Tips for Optimizing Rails on Oracle
What is ruby-oci8
Ruby on Rails with Oracle FAQ
Oracle® Database Express Edition 2 Day DBA
-> sur la machine "ex-fusio" : serveur Oracle XE
-> sur la machine "maison" : XE client - Ruby 1.8 venu avec InstantRails 1.4. SQL Developer.
Je peux me connecter à XE (apex) par mon navigateur et par SQLDeveloper (penser aux firewalls en particulier celui de "Ex-fusio", sur lequel il faut autoriser le port 1521 à discuter par TCP).
pour la partie ruby / oracle proprement dite, voici quelques remarques :
- problèmes de connexion ruby :
il faut le driver oci8 (et l'appeler par son nom dans la ligne de commande)
inutile d'essayer de le déposer au find fond de l'arborescence où ruby ne le trouvera pas ; le placer en haut dans rails_apps\.. et appeler la commande. Ruby propose pour commencer de le placer au bon endroit :
C:\apc_demo\InstantRails-1.4-win\InstantRails\ruby\lib\ruby\site_ruby\1.8\DBD\OCI8
Hein que c'était pas la peine de chercher...
Maintenant on ramène un résultat avec l'adresse de la base mais pas avec son alias tns.
C'est le même symptome que pour sqlplus.
Ce qui nous amène aux :
- problèmes de connexion Oracle
Rappelons que seul le client XE est installé sur cette machine. Théoriquement pas de tnsnames.ora.
On peut copier le tnsnames du serveur à l'endroit où l(on veut chez le client (je l'ai mis à côté de glogin.sql). Il faut ensuite faire pointer la var d'env TNS_ADMIN vers cet endroit.
Désormais la BD est accessible par son alias.
* exemples de commandes OK/KO selon l'état du tnsnames/TNS_ADMIN
- connexion ruby par oci8 avec l'adresse réseau :
C:\apc_demo\InstantRails-1.4-win\InstantRails\rails_apps>ruby -r oci8 -e "OCI8.new
('hr', 'scott', 'ex-fusio:1521').exec('SELECT * FROM jobs ORDER BY 1') do |r|puts r.join(' | '); end"
AC_ACCOUNT | Public Accountant | 4200 | 9000
AC_MGR | Accounting Manager | 8200 | 16000
../..
SH_CLERK | Shipping Clerk | 2500 | 5500
ST_CLERK | Stock Clerk | 2000 | 5000
ST_MAN | Stock Manager | 5500 | 8500
- connexion avec l'alias (SID)
C:\apc_demo\InstantRails-1.4-win\InstantRails\rails_apps>ruby -r oci8
-e "OCI8.new('hr', 'scott', 'xe').exec('SELECT * FROM jobs ORDER BY 1') do |r| puts r.join(' | '); end"
env.c:257:in oci8lib.so: ORA-12154: TNS : l'identificateur de connexion indiquÚ n'a pas pu Ûtre rÚsolu (OCIError)
from C:/apc_demo/InstantRails-1.4-win/InstantRails/ruby/lib/ruby/site_ruby/1.8/oci8.rb:210:in `initialize'
from -e:1:in `new'
from -e:1
- de même sous sqlplus on ne peut pas se connecter par l'alias :
C:\apc_demo\InstantRails-1.4-win\InstantRails\rails_apps>sqlplus hr@xe
SQL*Plus: Release 10.2.0.1.0 - Production on Dim. Mai 20 22:35:13 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Entrez le mot de passe :
ERROR:
ORA-12154: TNS : l'identificateur de connexion indiquÚ n'a pas pu Ûtre rÚsolu
- alors qu'on se connecte bien par le numéro de port :
C:\apc_demo\InstantRails-1.4-win\InstantRails\rails_apps>sqlplus hr@ex-fusio:1521
SQL*Plus: Release 10.2.0.1.0 - Production on Dim. Mai 20 22:35:49 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Entrez le mot de passe :
ConnectÚ Ó :
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> exit
- en chargeant la variable d'env TNS_ADMIN avec l'endroit où est situé le tnsnames.ora
C:\apc_demo\InstantRails-1.4-win\InstantRails\rails_apps>set TNS_ADMIN=c:\XEClient\sqlplus
C:\apc_demo\InstantRails-1.4-win\InstantRails\rails_apps>sqlplus hr@XE
SQL*Plus: Release 10.2.0.1.0 - Production on Dim. Mai 20 22:36:33 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Entrez le mot de passe :
ConnectÚ Ó :
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> exit
DÚconnectÚ de Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
- et ce n'est pas une histoire de majuscules :
C:\apc_demo\InstantRails-1.4-win\InstantRails\rails_apps>sqlplus hr@xe
SQL*Plus: Release 10.2.0.1.0 - Production on Dim. Mai 20 22:36:48 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Entrez le mot de passe :
ConnectÚ Ó :
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> exit
DÚconnectÚ de Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
- De même sous ruby :
C:\apc_demo\InstantRails-1.4-win\InstantRails\rails_apps>ruby -r oci8
-e "OCI8.new('hr', 'scott', 'xe').exec('SELECT * FROM jobs ORDER BY 1') do |r| puts r.join(' | '); end"
AC_ACCOUNT | Public Accountant | 4200 | 9000
AC_MGR | Accounting Manager | 8200 | 16000
AD_ASST | Administration Assistant | 3000 | 6000
../..
SA_MAN | Sales Manager | 10000 | 20000
SA_REP | Sales Representative | 6000 | 12000
SH_CLERK | Shipping Clerk | 2500 | 5500
ST_CLERK | Stock Clerk | 2000 | 5000
ST_MAN | Stock Manager | 5500 | 8500
- xe répond bien, et pas seulement le port 1521. Ça pourrait bien nous servir quand on voudra créer une appli AUTRE que HR.