Ruby i baza Oracle

Cześć.
Zaczynam z Ruby i sukcesywnie przechodzę przykłady z książką:
“Agile Web Development with Rails, 4th Edition, Rails 3.2” - Ruby S., Thomas D., Heinemeier Hansson D.
i niestety zatrzymałem się na połączeniu z bazą danych.

Używam:

  • windows 8.1
  • baza danych Oracle XE,
  • Ruby (ruby 2.2.3p173 (2015-08-18 revision 51636) [i386-mingw32]),
  • Rails (Rails 4.2.5).

Próbuję połączyć się z bazą Oracle zainstalowaną lokalnie na komputerze. Znalazłem kilka instrukcji i sposobów, ale zgodnie z zaleceniem autorów chciałbym skorzystać z konfiguracji zapisanej w ‘config/database.yml’, zawartość mojego pliku:

development:
adapter: oracle_enhanced
database: //localhost:1521/XE
username: depot
password: 12345678

Szukając połączenia z bazą zainstalowałem już:

  1. ruby-oci8
  2. activerecord-oracle_enhanced-adapter

Po edycji database.yml spróbowałem wygenerować scaffold poleceniem:

depot> rails db

Komunikat zwrotny jest następujący:

c:\Ruby22\Home\depot>rails db
Couldn’t find database client: sqlite3, sqlite3.exe. Check your $PATH and try again.

Wygląda na to, że pomimo zmienionego pliku database.yml Rails szuka bazy sqlite, które nie instalowałem.
Mam prośbę o wskazówkę, gdzie szukać bo utknąłem.
Z góry dzięki za wszelką pomoc.

Pozdrawiam
-=maruda=-

czy dla środowiska testowego też zmieniłeś sqlite na oracla ?

PS. szukaj w pliku config/database.yml

Tak. Wcześniej wszystkie środowiska przestawiłem na Oracle, ale było tak samo. W tej chwili database.yml wygląda tak jak wkleiłem, czyli jest tylko sekcja development:


Zrestartowałem server, zrestartowałem system i jest poprawa. Znaczy inny komunikat:

DEPRECATION WARNING: Passing a string to ActiveRecord::Base.establish_connection for a configuration lookup is deprecated, please pass a symbol (:oracle_enhanced) instead. (called from require at bin/rails:4)
C:/Ruby22/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/connection_specification.rb:248:in `resolve_symbol_connection’: ‘oracle_enhanced’ database is not configured. Available: [“development”, “adapter”,“database”, “username”, “password”] (ActiveRecord::AdapterNotSpecified)

Czuję, że jest poprawa, ale co z tym zrobić nie wiem :frowning:

Pierwszy problem rozwiązany. Błąd był we wcięciach w pliku database.yml
Oznaczenie środowiska zaczyna wiersz bez spacji, parametry w każdej linii poniżej poniżej mają dwie spacje na początku, czyli powinno być:

development:
adapter: oracle_enhanced
host: localhost
port: 1521
database: XE
username: depot
password: 12345678

Teraz jednak pojawił się inny błąd:

cpu>rake db:migrate
rake aborted!
LoadError: Could not load ‘active_record/connection_adapters/oracle_enhanced_adapter’. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than ‘mysql’, ‘mysql2’, ‘postgresql’ or ‘sqlite3’ add the necessary adapter gem to the Gemfile.

LoadError: cannot load such file – active_record/connection_adapters/oracle_enhanced_adapter

Tasks: TOP => db:migrate => db:load_config
(See full trace by running task with --trace)

Czy masz na pewno w gemfile

gem 'activerecord-oracle_enhanced-adapter'

I czy na pewno potem wykonałeś komendę
bundle install

Nie nie wykonałem i przyznam, że nie znalazłem instrukcji gdzie było podane to poleceni.
Dzięki. Faktycznie instalacja nie była skończona i teraz już jest.

Komunikat błędu trochę się zmienił:

cpu>rake db:migrate

rake aborted!
LoadError: Could not load ‘active_record/connection_adapters/oracle_enhanced_adapter’. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than ‘mysql’, ‘mysql2’, ‘postgresql’ or ‘sqlite3’ add the necessary adapter gem to the Gemfile.

LoadError: cannot load such file – active_record/connection_adapters/oracle_enhanced_adapter

Tasks: TOP => db:migrate => db:load_config
(See full trace by running task with --trace)

Nie mam w gemfile wpisu: gem ‘activerecord-oracle_enhanced-adapter’

OK, dodałem wpis do gemfile.
Komunikat znowu się zmienił:

cpu>rake db:migrate

rake aborted!
LoadError: ERROR: ‘cannot load such file – oci8’. ActiveRecord oracle_enhanced adapter could not load ruby-oci8 library. You may need install ruby-oci8 gem.
C:/Ruby22/Home/depot/Rakefile:6:in <top (required)>' LoadError: cannot load such file -- oci8 C:/Ruby22/Home/depot/Rakefile:6:in<top (required)>’
(See full trace by running task with --trace)

Zainstalowałem ruby-oci8 za pomocą gem’a a następnie wydałem polecenie bundle install.
Potem dla pewności sprawdziłem poleceniem > bundle show ruby-oci8
i otrzymałem wynik:

cpu>bundle show ruby-oci8
Could not find gem ‘ruby-oci8’.

To musisz dodać gema do gemfile, zapisac i wtedy bundle install i rake db:migrate. Odnoszę wrażenie, że nie zrobiłeś tego jak powinieneś

Wygląda, że jestem naprawdę blisko rozwiązania problemu. Skorzystałem z opisu konfiguracji połączenia i ustawienia pliku gemfile ze strony enter link description here

Teraz już TNS odpowiedział błędem, więc zakładam że zapukałem do bazy :smile:

Tak sobie tylko gdybam, że zamiast zrobić tak:

  1. Dodać odpowiednie wpisy do gemfile, np.:
gem 'ruby-oci8'
gem 'activerecord-oracle_enhanced-adapter'
  1. Zainstalować i dodać gemy do projektu (zbundlować) przez polecenie:
    bundle install

Ty tylko robisz:
gem install nazwa_gemu

A gem install tylko instaluje gem “globalnie” dla danej wersji Rubiego. Ale nie powoduje że w jakiś magiczny sposób twoja aplikacja może go używać. Z Railsami jest troszkę inaczej, musisz wyraźnie w pliku gemfile wpisać dokładnie te gem’y które chcesz używać, potem zbundlować je poleceniem bundle. I dopiero wtedy railsy będą używać tych gemów.

Bundler w dużym skrócie czyta plik gemfile, a następnie na jego podstaw instaluje każdy gem wraz zależnościami i zapisuje co i w jakiej wersji jest zainstalowane do gemfile.lock. Potem jak server startuje to bundler na podstawie tego pliku jest wstanie bez problemu wczytać sobie wszystkie odpowiednie pliki i pozwolić po prostu railsom działać. Jeżeli w pliku gemfile nie będzie odpowiedniego wpisu, albo nie wykonasz po jego zmianie “bundle” to wtedy przy uruchamianiu servera bundler nie wczyta odpowiednich pakietów i przy próbie ich użycia wywali błąd taki jak np. te które ty dostajesz.

Nie założę się, ale chyba w każdym w miarę sensownym tutorialu do railsów jest napisane co to gemfile i bundler. Może warto było by, żebyś jakiś taki prosty tutorial przerobił, wtedy wiele rzeczy jest naprawdę jaśniejszych.

Dziękuję za pomoc - działa.
Ostatni problem z TNS polegał na tym, że wywaliła się baza czego nie zauważyłem, po podniesieniu bazy wszystko śmiga :smile:

Podsumowując, już na marginesie, to niestety tutoriale nie opisują do czego służą i jaką rolę pełnią poszczególne narzędzia/moduły. Książka z której korzystam odsyła w tym celu do strony rubyforge.org, ale niestety ta nie działa…
Tak czy inaczej Wasze wpisy bardzo mi pomogły zrozumieć co do czego służy.
DZIĘKUJĘ.