In questo post vedremo come accedere ad un database sqlite utilizzando Ruby.
La scelta di sqlite è dovuta alla sua estrema semplicità di gestione, in quanto il database consiste in un unico file.
Per prima cosa occorre installare una libreria per poterlo utilizzare da ruby. Basta digitare da terminale gem install sqlite3-ruby
.
Ora creiamo il file sqlite-test.rb con il seguente contenuto:
require 'sqlite3'
require 'test/unit'
class DatabaseTest < Test::Unit::TestCase
def setup
@db = SQLite3::Database.new 'test.db'
end
def teardown
@db.close
end
def test_create
assert File.exist? 'test.db'
end
end
Come si puo' vedere dal test il database consiste in un unico file test.db creato nella stessa directory. Se lanciamo il test abbiamo barra verde.
Proviamo ora a creare una tabella e ad inserire alcuni dati. Aggiungiamo quindi il test:
def test_create_table
sql = <<SQL
create table names (
id int primary key,
name text
);
SQL
@db.execute sql
assert_equal @db.execute('select * from names'), []
end
Proviamo a lanciarlo: Barra verde. Se proviamo però a rilanciarlo otteniamo l'errore:
SQLite3::SQLException: table names already exists
.
Per risolvere il problema cancelliamo la tabella, se esiste, prima di crearla utilizzando il comando:
drop table if exists names;
. Un'altra alternativa potrebbe essere la cancellazione del file di database.
def test_create_table
sql = <<SQL
drop table if exists names;
create table names (
id int primary key,
name text
);
SQL
@db.execute_batch sql
assert_equal @db.execute('select * from names'), []
end
Notare che ho modificato execute con execute_batch perché altrimenti sarebbe stata eseguita solo una delle due query.
A questo punto siamo pronti per inserire alcuni dati e verificare che siano presenti nella tabella
def test_create_table
sql = <<SQL
drop table if exists names;
create table names (
id int primary key,
name text
);
insert into names values(1, 'a');
insert into names values(2, 'b');
SQL
@db.execute_batch sql
assert_equal @db.execute('select * from names'), [[1, 'a'], [2, 'b']]
end
Come si puo' leggere dal test i dati vengono restituiti come un array di array.
Altre informazioni su come usare sqlite le potete trovare qui