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)
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.
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å! |