Next Previous Contents

5. Databaser

Det finnes en bråte av Ruby-bindinger til mange forskjellige databaser. Man kan bruke disse for å koble seg direkte til databasen og ha full tilgang til alle dens særegenheter.

For eksempel kan man benytte MySQL-bindingene direkte. (En liten innføring til Ruby og MySQL)

5.1 Databasegrensesnitt: dbi

Men det gjør også at man knytter seg mer fast til typen database som brukes, så det kan være lurt å generalisere litt. Biblioteket dbi er et overbygg som gir et mer generelt grensesnitt til mange databaser i Ruby. Du må fremdeles installere de databasespesifikke bindingene, men i koden du skriver trenger du ikke knytte deg unødig tett til databasetypen.

  1| require 'dbi' 
  2| 
  3| databasenavn = 'kentda_rubynuby_webapp'
  4| brukernavn   = 'kentda_rubynuby'
  5| passord      = 'w3bRg0y1'
  6| server       = 'mysql.pvv.ntnu.no'
  7| 
  8| DBI.connect("DBI:Mysql:database=#{databasenavn};host=#{server}", 
  9|             brukernavn, passord) do |dbh|
 10| 
 11|   # Et enkelt select-kall hvor hver resultatrad sendes til en block.
 12|   dbh.select_all('select fornavn, etternavn from person') do |rad|
 13|     puts rad.join(', ')
 14|   end  
 15| 
 16|   # Stedfortreder-argumenter (placeholders) i SQL-uttrykk. 
 17|   soek_etternavn = "Nordma%"
 18|   soek_fornavn = "Ol%"
 19|   dbh.select_all('select brukerid, brukernavn, fornavn, etternavn ' +
 20|                  'from person where etternavn like ? and fornavn like ?', 
 21|                  soek_etternavn, soek_fornavn ) do |rad|
 22|     puts rad.join(', ')
 23|   end  
 24| 
 25|   # Hent en liste (Array) med alle e-postadressene.
 26|   liste = dbh.select_all('select * from person').collect{|rad| rad['epost'] }
 27|   puts liste.join(', ')
 28| 
 29| end

Legg merke til at vi her angir blokker til metodekallene. Dette gjør at vi slipper å huske på å slippe ressursene løs selv; det skjer automatisk når blokken er ferdig utført.

Når man skal gi argumenter inn i SQL uttrykkene, kan man bruke strenginterpolering eller addere strenger selv. Men stedfortreder-argumenter, som brukt over, er å foretrekke, da det både er ryddigere, bruker mindre minne og lar biblioteket gjøre argument-escaping for deg.

SQL insert

Select-metodene er enkle å bruke, men man har ofte litt større behov, så som å skrive til databasen.

  1|   # 'do' kjører SQL-uttrykk og returnerer antall rader påvirket.  
  2|   n = dbh.do("INSERT INTO person VALUES (NULL, 'rubynuby1', " + 
  3|              " 'Nuby', 'Ruby', 'r0bY', 'nuby1@ruby.no')")
  4|   puts "Antall rader påvirket av 'do': #{n}"
  5|   
  6|   # 'execute' kan brukes omtrent som 'do', men gir et
  7|   # DBI::StatementHandle tilbake.
  8|   sth = dbh.execute('INSERT INTO person VALUES (NULL, ?, ?, ?, ?, ?)',
  9|                     'rubynuby2', 'Nuby', 'Ruby', 
 10|                     'r0bY', 'nuby2@ruby.no')
 11|   puts "Antall rader påvirket av 'execute': #{sth.rows}"
 12|   sth.finish # Ikke bruker block? Husk å lukke ressurser.
 13| 
 14|   # 'execute' kan også gi oss et "halvferdig" statement.
 15|   dbh.prepare('INSERT INTO person VALUES (NULL, ?, ?, ?, ?, ?)') do |sth|
 16|     # Kjekt når ting skal gjentas endel...
 17|     sth.execute( 'rubynuby3', 'Nuby', 'Ruby', 'r0bY', 'nuby3@ruby.no')
 18|     sth.execute( 'rubynuby4', 'Nuby', 'Ruby', 'r0bY', 'nuby4@ruby.no')
 19|     sth.execute( 'rubynuby5', 'Nuby', 'Ruby', 'r0bY', 'nuby5@ruby.no')
 20|   end # Møkk lei sth.finish nå!


Next Previous Contents