Ruby on Rails
HowtoUsareSQLite

SQLite è un database leggero conforme SQL. Il download è di circa 244kb (il client a linea di comando + DLL).

SQLite implementa la maggior parte dello standard SQL92 e non necessita di configurazioni. SQLite è una soluzione “solo client” che non necessita di un processo server separato.

Per i migliori risultati, utilizzate SQLite 3.3.4 o versioni successive.

Installare SQLite

Windows

Per utilizzare SQLite per windows avete bisogno di due files:

  1. SQLite DLL
  2. SQLite client a linea di comando per la creazione di tabelle

Questi possono essere scaricati come binari precompilati dall’ Homepage di SQLite

Aggiungete sqlite(3).exe e sqlite(3).dll al vostro percorso.

C:\ruby\bin

Unix

La maggior parte dei gestori di pacchetti inseriscono un file binario sqlite o sqlite3 nel vostro percorso.
Se lo compilate dai sorgenti, provate ‘/usr/local/bin/sqlite(3)’.

Se avete bisogno di memorizzare dati UTF-8 nel vostro database assicuratevi di fornire l’opzione —enable-utf8 allo script ./configure

Mac OS X fino alla versione 10.3.9

con DarwinPorts

<pre> sudo port install sqlite3 sudo port install sqlite # for sqlite 2 </pre>

Mac OS X 10.4 (aka Tiger) e successivi

sqlite3 è parte integrante di Mac OS X 10.4. Il suo percorso è ‘/usr/bin/sqlite3’. Non avete bisogno di intallarlo.

Ottenere sqlite ruby gem

Utilizzare gem per installare sqlite per Ruby

Windows

<pre>C:\work\rb\test>gem install sqlite-ruby

C:\work\rb\test>"c:\ruby\bin\ruby.exe" “c:\ruby\bin\gem” install sqlite
Attempting local installation of ‘sqlite’
Local gem file not found: sqlite*.gem
Attempting remote installation of ‘sqlite’
Select which gem to install for your platform (i386-mswin32)
1. sqlite-ruby 2.2.3 (ruby)
2. sqlite-ruby 2.2.3 (mswin32)
3. sqlite-ruby 2.2.2 (ruby)

>

Selezionate l’opzione 2.

Quando utilizzate SQLite 3:
<pre>C:\work\rb\test>gem install sqlite3-ruby

C:\work\rb\test>"c:\ruby\bin\ruby.exe" “c:\ruby\bin\gem” install sqlite3
Attempting local installation of ‘sqlite3’
Local gem file not found: sqlite3*.gem
Attempting remote installation of ‘sqlite3’
Select which gem to install for your platform (i386-mswin32)
1. sqlite3-ruby 1.1.0 (mswin32)
2. sqlite3-ruby 1.1.0 (ruby)
3. sqlite3-ruby 1.0.1 (ruby)

>

Selezionate l’opzione 1.

UNIX and Mac OS X

NOTA BENE: I sistemi UNIX e Mac OS X devono avere swig installato prima di installare i gem sqlite-ruby o sqlite3-ruby. Altrimenti gem non utilizzerà le attuali librerie sqlite, ma utilizzerà una versione di libreria sqlite in ruby puro che non funziona correttamente.

Su Mac OS X, potete installare SWIG utilizzando DarwinPorts come segue:

sudo port install swig

Poi installate il gem come segue:

sudo gem install sqlite3-ruby
A meno che non otteniate questo:

  Attempting local installation of 'sqlite3'
  Local gem file not found: sqlite3*.gem
  Attempting remote installation of 'sqlite3'
  ERROR:  While executing gem ... (Gem::GemNotFoundException)
    Could not find sqlite3 (> 0) in the repository

Vedrete il seguente:

Select which gem to install for your platform (powerpc-darwin8.0)
 1. sqlite3-ruby 1.1.0 (ruby)
 2. sqlite3-ruby 1.1.0 (mswin32)
 3. sqlite3-ruby 1.0.1 (ruby)
 ...
 11. Cancel installation

Scegliete la versione “(ruby)” con numero più alto, in questo caso l’opzione 1.

Creare un database

SQLite memorizza i databases in files. Per creare un nuovo database, eseguite il comando sqlite con un nome file per il vostro databse, e iniziate ad aggiungere le tabelle.

Windows

<pre>C:\work\rb\test>sqlite db\test.db SQLite version 2.8.16 Enter ".help" for instructions sqlite> create table articles ...> (id integer primary key, ...> title varchar(255), ...> text varchar(1024) ...> ); sqlite> .quit

C:\work\rb\test>dir db
Volume in drive C has no label.
Directory of C:\work\rb\test\db
14.04.2005 14:14 4 096 test.db
1 File(s) 4 096 bytes
C:\work\rb\test>

Unix e Mac OS X

In un sistema UNIX, e dato per assunto che abbiate un file che contiene una serie di istruzioni SQL per la creazione di questo database (per esempio da un’applicazione che state distribuendo), potete abbreviare l’operazione di creazione:
<pre> $ mkdir ~/databases $ sqlite3 ~/databases/rails-app.db < /path/to/schema.sql

SQLite version 3.1.2
Enter “.help” for instructions
sqlite> .schema

# Prints the schema

sqlite> .quit

Configurare il file database.yml per utilizzare sqlite

SQLite non utilizza autenticazione e necessita solamente di un puntatore al file di database.
Il parametro adapter dice a Ruby di utilizzare SQLite come database.

<pre>development: adapter: sqlite dbfile: db/dev.db

test:
adapter: sqlite
dbfile: db/test.db

production:
adapter: sqlite
dbfile: db/prod.db

NOTA BENE: Se state utilizzando SQLite3 scrivete “sqlite3” invece di “sqlite” per il valore del parametro adapter.

Ed è fatta!

Possibili problemi

D: Ottengo degli errori quando provo ad installere il gem…

sudo gem install sqlite
Attempting local installation of ‘sqlite’
Local gem file not found: sqlite*.gem
Attempting remote installation of ‘sqlite’
Building native extensions. This could take a while…
ERROR: While executing gem … (RuntimeError)
ERROR: Failed to build gem native extension.
Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/sqlite-2.0.1 for inspection.
ruby extconf.rb install sqlite
checking for main() in -lsqlite… no
checking for sqlite.h… no

Qualche consiglio? Ho già installato sia swig che sqlite via DarwinPorts, che mette le sue cose in /opt/…

%{color:green} Ho avuto lo stesso problema. Usa
gem install sqlite-ruby -- --with-sqlite-dir=/opt/local — Kanwei %

R: Ci sono diverse possibili cause; se non hai Xcode installato il file header ruby.h è stato spostato da /usr/lib/ruby/1.8/powerpc-darwin8.0/ruby.h a /usr/lib/ruby/1.8/universal-darwin8.0/ruby.h. Come risultato non viene trovato da gem. Alcune persone hanno trovato che symlinks risolve il problema, ma molti lettori di comp.lang.ruby giudicano l’installazione di ruby dai sorgenti come l’installazione di ruby che viene distribuita con Tiger è ritenuto essere un pò bacato. —GrahamAshton

B: HO due versioni di Ruby installate via DarwinPorts. Sfortunatamente rb-rubygems era collegato alla vecchia (1.8.2). La mia soluzione è stata quella di disinstallare ruby (1.8.2 e 1.8.4) e rb-rubygems e reinstallarli dopo swig. —Michael

Ho ottenuto esattamente lo stesso errore, ma è risultato che Ubuntu Breezy non installa di default gcc, un veloce

sudo apt-get install gcc
lo ha risolto. Probabilmente non è rilevante con quello detto sopra dal momento che DarwinPorts è inutile senza gcc

Anche io ho ricevuto lo stesso errore (Ubuntu Breezy), ma era perchè il file sqlite3.h era mancante. Avete bisogno di libsqlite3-dev:

sudo apt-get install libsqlite3-dev

D: Sto riscontrando degli strani errori sul database su Linux/Unix

R: Il gem sqlite è di default la versione in ruby pura, la quale non sempre funziona. La soluzione è:

  1. Disinstallare il gem sqlite (sqlite-ruby o sqlite3-ruby).
  2. Installare swig attraverso il gestore di pacchetti del tuo sistema operativo oppure scaricandoli e compilandoli.
  3. Reinstallare il gem sqlite ed ora dovrebbe compilare la versione ‘nativa’ utilizzando le attuali dll sqlite.

R: Su Mac OS X 10.4 Tiger, prova a disinstallare il gem (sudo gem uninstall sqlite3), poi utilizza DarwinPorts per installare SWIG (sudo port install swig), poi reinstalla il gem SQLite3 (sudo gem install sqlite3).

D: La versione Windows mi dà un messaggio di errore come “Application failed to start because sqlite.dll was not found. Re-installing the application may fix this problem.”

R: Assicurati che .dll e .exe siano in uno dei persorsi specificati nella variabile di sistema PATH. Se hai installato sqlite3 allora usa per esempio ‘sqlite3 db\test.db’ per creare un database. Nel tuo file database.yml devi usare ‘adapter: sqlite3’.

D: SQLite::Exceptions::\DatabaseException file is encrypted or is not a database.

R: Sembra che i databases sqlite creati con la versione 2 non funzionino con sqlite versione 3 e viceversa.

D: SQLite restituisce “0.0” per i valori dalle viste del database.

R: Sembra che Rails pensi che il campo è un float? Puoi inserire numeri nei campi, ma le stringhe vengono mostrate come 0.0. Prova ad aggiungere un specificatore del tipo di campo (es. TEXT) nella definizione del database.

D: Utilizzando SQLite in Rails fa terminare il server webrick sollevando un segfaults del tipo “deadlock 0xb781a95c: run:-/usr/lib/ruby/1.8/drb/drb.rb:932: [BUG] Segmentation fault”. Qualche suggerimento?

R: Questo sembra essere un problema con sqlite-ruby. Probabilmente non lo hai installato correttamente. Guarda la domanda precedente riguardo a strani errori sul database. Su Mac OS X 10.4 Tiger, prova a disinstallare il gem (sudo gem uninstall sqlite3), poi utilizzate DarwinPorts o Fink per installare SWIG (sudo port install swig), assicurandovi che SWIG sia nel vostro PATH, poi reinstallate il gem SQLite3 (sudo gem install sqlite3).

D: Sembra che il metodo save di ActiveRecord non imposti l’id per la riga inserita dopo il salvataggio del record sul database SQLite. E’ un problema di SQLite o di ActiveRecord?

R: Assicuratevi che il campo ID sia settato come INTEGER PRIMARY KEY. Non INTEGER(10) PRIMARY KEY, INT PRIMARY KEY o qualsiasi altra variante. E’ Case sensitive. Potresti imbatterti nell’errore ‘id must not be NULL’.

D: Sto utilizzando Migrations e sto riscontrando lo stesso problema. ActiveRecord non imposta l’id dopo un salvataggio. Controllando lo schema del database, Ho: “id” INTEGER PRIMARY KEY NOT NULL. Qualche suggerimento?

D: Stesso qui – Sto utilizzando migrations per creare una tabella e l’id non viene impostato dopo un inserimento. Migrations sta creando la colonna id come INTEGER PRIMARY KEY NOT NULL. C’è qualche scappatoia?

D: WEBrick sta protestando su “\ArgumentError: No database file specified. Missing argument: dbfile”

R: sqlite3 utilizza il parametro “dbfile:” al posto di “database:”, che è facile da individuare mentre si modifica un file database.yml che è preconfigurato per MySQL.

D: ActiveRecord::Migration supporta SQLite?

R: Migrations sembra funzionare bene con SQLite in Rails 0.14.0 e successivi. Le migrations con SQLite migrations non sono supportate nelle precedenti versioni di Rails.

D: Sono un novizio quindi scusate questa domanda. Devo utilizzare la versione gem di Ruby-Sqlite, oppure funzionerà anche un ruby-sqlite non in versione gem? (Sono su *nix)

R;

Ubuntu Linux

Questo è quello che ha funzionato per me:

sudo apt-get install libsqlite3-0 libsqlite3-dev sqlite3 swig
sudo gem install sqlite3-ruby

# Select the highest Ruby version (ususally 1.)

Se non installate il pacchetto libsqlite3-dev, allora non avrete i files header di cui necessitate per compilare le estensioni native quando installate il Rubygem.

Spero che vi aiuti.

Debian sid

Per installare Ruby on Rails su Debian sid fate:

apt-get install rails sqlite3 sqlite3-ruby

Avete bisogno di utilizzare sqlite3 come adapter nel file config/database.yml.
::
category:HowTo

Se ricevete altri errori bizzarri, forse state utilizzando la sintassi MySql (anzichè dello “standard” SQL) per la creazione delle tabelle. L’esempio in questa pagina ha funzianato per me su Rails. -Max

Esempio di errore bizzarro:

SQLite3::SQLException: SQL logic error or missing database: INSERT INTO

Una possibile soluzione alternativa a questo tipo di errori è quello di controllare la proprietà (ownership) del file di database, sembra che qualche volta (i.e. rails 1.1 sqlite 3.2.8) il processo di scrittura (i.e. apache/webbrick) devono essere i proprietari del file di database (i.e. i permessi in scrittura non sono sufficienti) Io suppongo che questo ha qualcosa a che fare con il locking – occ