Rails et Oracle
Pour cette fin d’annee, je voulais terminer par une note sur Rails: Comment coupler une appli Rails a une base Oracle .
1) Installer Ruby: privilégier la version One Click Installer de Ruby (qui embarque RubyGems et Rake notamment). Downloader, lancer le .exe : c’est installé.
Ajoutez les variables d’environnement :
RUBY_HOME=c:\path\to\ruby
GEM_HOME=%RUBY_HOME%\lib\ruby\gems\1.8
PATH=%RUBY_HOME%\bin;%GEM_HOME%\bin
2) Si vous êtes derrière un proxy/firewall , que vous n’avez pas pu faire fonctionner RubySSPI alors vous allez downloader et installer les .gem suivant localement (dans l’ordre) : activesupport (1.3.1), activerecord (1.14.4), actionpack(1.12.5), actionmailer (1.2.5), actionwebservice (1.1.6), et rails (1.1.6)
La commande pour installer un .gem est : gem install /path/to/file.gem
3) Pour un travail en ‘local’ downloader et installer Oracle XE, qui permettra d’avoir une base de données et un Oracle Client.
Si vous avez déja une base de données Oracle (10g) sur un serveur distant, installer le client localement (ou sur votre frontal web) seulement.
4) Downloader et installer le driver Ruby/OCI8
Lancer l’installer: C:\temp> ruby ruby-oci8-x.y.zz-mswin32.rb
Vérifier l’installation du driver Ruby/OCI8:
Dans une fenetre de terminal, taper :
irb
Puis :
irb(main)>require ‘oci8′
=> true
irb(main)>exit
Avant de poursuivre, vérifier dans le fichier TNSADMIN.ORA, que l’instance de Oracle XE est présente. Vous devrez voir ce genre de section dans le fichier:
XE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
Pour localiser le fichier :
Pour un serveur Oracle XE local, rechercher dans un chemin du genre :
C:\oraclexe\app\oracle\product\10.2.0\server\network\admin\tnsnames.ora
Positionner la variable d’environnement ORACLE_HOME : /path/to/oracle_server/home
Et rajouter %ORACLE_HOME%/bin dans le path
Pour ceux qui auront installé Oracle XE, on s’apercoit qu’il n’y a pas SQL*Plus pour faire du SQL dans un terminal…Installer le package standalone de SQL*Plus – Instant Client
Deployez le zip ou vous le souhaitez (C:\oracle\product\10.2.0)
Un répertoire ‘instantclient_10_2′ sera créé. Ajouter le chemin complet dans votre PATH.
Testez la connection a XE dans un nouveau terminal :
%> sqlplus system/manager@XE
Connecté à :
Oracle Database 10g Express Edition Release 10.2.0.1.0 – Production
Dans SQL*Plus, créez 3 schémas RAILS_DEV (password: secret), RAILS_TEST (password: secret) et RAILS_PROD (password: secret). N’oubliez pas de granter les droits de se créer une session et des objets (table, vue, séquence, procédure, trigger). Exemple pour le schéma RAILS_DEV (à réitérer pour RAILS_TEST et RAILS_PROD)
SQL> CREATE USER rails_dev IDENTIFIED BY secret DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
SQL> grant create session to RAILS_DEV;
SQL> grant create table to RAILS_DEV;
SQL> grant create view to RAILS_DEV;
SQL> grant create procedure to RAILS_DEV;
SQL> grant create sequence to RAILS_DEV;
SQL> grant create trigger to RAILS_DEV;
Testez la connection:
SQL>conn RAILS_DEV/secret@XE
OK? Et maintenant, un peu de Rails.
Conventions pour les objets Oracle avec Rails
Rails est concu pour fonctionner avec un certain nombre de conventions. Adhérer à ces conventions augmente significativement la productivité et favorise une meilleure maintenance du code. Les deux conventions principales a connaitre:
- Pluralisation du nom des tables (orders, products). La table sera mappée à un objet (Modele) du meme nom, mais au singulier (Order, Product)
- Pour chaque table, une primary key portant le nom id devra etre créée. Sur Oracle, créer une séquence portant le nom de la table suffixé par _seq (orders_seq par exemple): c’est automatique en passant par les scripts de migration.
Créer l’application
Nous allons juste creer l’ebauche d’une application todo-list, jusqu’a la creation du data model en base, qui nous valide ainsi que la connexion a Oracle se fait bien.
Dans un terminal, au niveau de votre workspace Rails, créer une application ainsi :
C:/workspace/railsprojects/> rails todolist
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
….
Configurer la base de données
Dans le répertoire C:/workspace/railsprojects/todolist/config, éditer database.yml , et remplacer le contenu par (Attention: YAML est tres sensible. Le fichier ne doit pas contenir de [TABS] mais des [SPACE]):
development:
adapter: oracle host: XE username: rails_dev password: secret test: adapter: oracle host: XE username: rails_test password: secret production: adapter: oracle host: XE username: rails_prod password: secret
Créer les structures en base
Nous allons créer les tables en base en utilisant les facilités de migration , ce qui evite de passer des ordres DDL par SQL*Plus d’une part, et est completement portable d’autre part.
Changer de répertoire vers C:/workspace/railsprojects/todolist/
Taper : ruby script/generate model Task
La classe Task est créée dans le répertoire app/models
Les tests dans le repertoire test (inclut unit , fixtures)
Le script de migration est créé dans le répertoire db/migrate
Notre application to-do list va etre très simple. Le data model sera constitué d’un objet Model (mappant une table Oracle) contenant les attributs suivants :
- title: titre ou nom de la tache
- completed_date : date limite de l’execution de la tache.
- description: texte libre decrivant la tache a effectuer
- status : tache au statut ‘pending’ ou ‘complete’
2 attributs ‘internes’ (audit) :
- created_on : date de création de la tache
- completed_on: Date d’exécution de la tache
Editer le fichier db/migrate/001_create_tasks.rb et ajouter :
class CreateTasks < ActiveRecord::Migration
def self.up
create_table :tasks do |t|
t.column :title, :string
t.column :completed_date, :datetime
t.column :description, :string
t.column :status, :string
t.column created_on, :timestamp
t.column completed_on, :timestamp
end
end
def self.down
drop_table :tasks
end
end
Créer le datamodel: pour cela, exécuter la commande : rake migrate
Pour verifier, se reconnecter a Oracle XE via SQL*Plus et lancer la requete :
SELECT TABLE_NAME FROM USER_TABLES;
Le developpement complet de l’application Todo-List fera l’objet d’une serie d’articles debut 2007.

Intéressant. Ça me rappelle une histoire concernant Google et leur système AdWords. AdWords a été créé avec MySQL et lorsqu’ils ont voulu utiliser un “real” SGBDR (Oracle en l’occurence), c’était moins bien.
* http://xooglers.blogspot.com/2005/12/lets-get-real-database.html
* http://en.wikipedia.org/wiki/AdWords#Technology
Je ne suis pas expert en la matière, mais il serait intéressant d’avoir un aperçu des différences. En passant, une saine lecture en la matière que je ne peux que recommander : http://railsexpress.de/blog/