Sto provando Rails, in particolare il comando rake db:migrate.
Ero riuscito a creare la tabella in questo modo, poi nelle prove ho
cancellato il progetto e rifatto.
Ora se do il comando rake:db migrate non mi crea il db, ma non mi da
nessun
errore.
nathan:/var/rails/commerce# script/generate model Product
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/product.rb
create test/unit/product_test.rb
create test/fixtures/products.yml
create db/migrate
create db/migrate/001_create_products.rb
nathan:/var/rails/commerce# rake db:migrate
(in /var/rails/commerce)
nathan:/var/rails/commerce#
Questo è l’output, ma se vedo il db niente tabella.
mysql> show tables
-> ;
±-------------------------------+
| Tables_in_commerce_development |
±-------------------------------+
| schema_info |
±-------------------------------+
1 row in set (0.00 sec)
Quando c’ero riuscito l’output generato era questo:
nathan:/var/rails/commerce# rake db:migrate
(in /var/rails/commerce)
== CreateCommerces: migrating
– create_table(:commerces)
-> 0.0440s
== CreateCommerces: migrated (0.0442s)
il file /config/database.yml dovrebbe essere giusto. prima mi chiede di
mettere la password, la metto e non fa più niente…
Cosa posso aver sbagliato?
Grazie a tutti
Bonzo
Scusa la domanda banale: qual’è il contenuto di
db/migrate/001_create_products.rb?
–
blog: www.lucaguidi.com
Bringing Rails to Italy
First italian Ruby On Rails conference:
Oct, 26-27 2007 - Pisa
www.railstoitaly.org
class CreateProducts < ActiveRecord::Migration
def self.up
create_table :products do |t|
t.column :title, :string #titolo
end
end
def self.down
drop_table :products
end
end
Scusate se non lo ho postato
2007/8/27, Luca G. [email protected]:
Se gli esperimenti li hai fatti tutti sulla stessa applicazione o sullo
stesso db, può darsi che schema_info.version sia rimasto su 1 e quindi
non ti effettua la migration.
Se è così basta digitare: rake db:migrate VERSION=0
e poi normalmente rake db:migrate
Fammi sapere se è questo il problema.
Ciao.
–
blog: www.lucaguidi.com
Bringing Rails to Italy
First italian Ruby On Rails conference:
Oct, 26-27 2007 - Pisa
www.railstoitaly.org
Il task db:migrate controlla il valore presente in schema_info.version e
lo confronta con la numerazione dei file contenuti in db/migration.
Se questi è minore del file con numerazione più alta, esegue tutte le
migrations secondo l’ordine prestabilito. Se è uguale non esegue nulla,
anche se le migration sono cambiate, come nel tuo caso.
Quindi, per uscire da questa situazione, cancella tutte le tabelle e
azzera il valore in tabella. Poi esegui il task normalmente.
–
blog: www.lucaguidi.com
Bringing Rails to Italy
First italian Ruby On Rails conference:
Oct, 26-27 2007 - Pisa
www.railstoitaly.org
Ok, mi funziona.
Grazie mille
Bonzo
Il 27/08/07, Luca G. [email protected] ha scritto:
Forse è questo, però se faccio come dici tu mi dice
così:nathan:/var/rails/commerce# rake db:migrate VERSION=0
(in /var/rails/commerce)
== CreateProducts: reverting
– drop_table(:products)
rake aborted!
Mysql::Error: Unknown table ‘products’: DROP TABLE products
(See full trace by running task with --trace)
nathan:/var/rails/commerce#
Il db è lo stesso, ma ho cambiato il nome della tabella, e quella vecchia
la
avevo cancellata.
Il 27/08/07, Luca G. [email protected] ha scritto:
In teoria, se non hai aggiunto altre tabelle, puoi fare la rollback
dello schema, portandolo alla versione zero, aggiungendo la colonna
interessata e poi rieseguendo il task di migrazione.
Ad ogni modo puoi sempre creare migrazioni con l’apposito script
(consigliato):
$ ruby script/generate migration AddPriceToProducts
Questo ti creerà un file (db/migration/002_add_price_to_products.rb),
nel quale scrivere:
class AddPriceToProducts < ActiveRecord::Migration
def self.up
add_column :products, :price, :string #eventuali opzioni
end
def self.down
remove_column :products, price
end
end
–
blog: www.lucaguidi.com
Bringing Rails to Italy
First italian Ruby On Rails conference:
Oct, 26-27 2007 - Pisa
www.railstoitaly.org
Concludo con una domanda.
Se voglio aggiorare la tabella mettendo una nuova colonna devo fare un
secondo file
db/migrate/002_create_products.rb?
Ripetendo il contenuto del primo e aggiungendo le nuove righe?
Il 27/08/07, Bonzo [email protected] ha scritto:
Bello, così ho tutto lo storico delle modifiche fatte al DB.
poi lo lancio sempre con rake db:migrate?
Come fa il comando Rake a capire che file cosa cambiare? rilegge tutti i
file dentro migrate?
class AddPriceToProducts < ActiveRecord::Migration
def self.up
add_column :products, :price, :string #eventuali opzioni
end
Questo aggiunge una colonna price alla tabella products?
Grazie
Bonzo
Il 27/08/07, Luca G. [email protected] ha scritto:
On Mon, 27 Aug 2007 15:40:18 +0200, Bonzo wrote:
Bello, così ho tutto lo storico delle modifiche fatte al DB.
poi lo lancio sempre con rake db:migrate?
Come fa il comando Rake a capire che file cosa cambiare? rilegge tutti i
file dentro migrate?
Non penso sia necessario. Il tuo “add_column” si traduce in un SQL ALTER
TABLE statement (con varianti per accogliere i differenti motori SQL)
quindi ogni migrazione è autoconsistente. Legge solo la versione in
schema_info e da lì sa quale file eseguire.
Ci vuole un po’ di disciplina a usare le migrazioni ed è facile perderci
una paio di ore inutilmente se per caso uno si scorda di rimuovere delle
robe in un qualche file. Ieri è successo a me e per venirne fuori ho
dovuto fare un po’ di salti mortali. In altre parole: migrations è ottimo
per avere una traccia di quel che è successo al db e funziona davvero
bene; potrebbe essere un po’ più ‘gentile’ e dare una mano in più quando
qualcosa va storto.
Un consiglio che ti do è di non esitare di farne tante. A volte ti prende
la mano e fai tre tabelle con dati di prova nella stessa migrazione.
Quelle sono poi i più suscettibili a errori quando arriva il giorno che devi
andare avanti e indietro nella “vita” del tuo schema.

Ok, credo di aver capito.
Quindi conviene fare migration a piccoli passi, in modo da avere uno
sviluppo incrementale che va avanti poco alla volta, in modo da poter
tornare indietro facilmente.?
Il 27/08/07, David [email protected] ha scritto:
Ti rispondo citandomi 
Il task db:migrate controlla il valore presente in schema_info.version e
lo confronta con la numerazione dei file contenuti in db/migration.
Se questi è minore del file con numerazione più alta, esegue tutte le
migrations secondo l’ordine prestabilito. Se è uguale non esegue nulla,
anche se le migration sono cambiate, come nel tuo caso.
–
blog: www.lucaguidi.com
Bringing Rails to Italy
First italian Ruby On Rails conference:
Oct, 26-27 2007 - Pisa
www.railstoitaly.org
Le migration sono nate per avere consistenza ed allineamento tra
versioni del codice e versioni del database schema. Il concetto è di
poter tornare ad un certo stadio, così come gli SCM ti permettono.
Ricorda questi princìpi quando lavori con il db.
–
blog: www.lucaguidi.com
Bringing Rails to Italy
First italian Ruby On Rails conference:
Oct, 26-27 2007 - Pisa
www.railstoitaly.org
un qualche link con esempi lo avete?
mi sembra di aver capito il concetto ma non sarebbe male avere degli
esempi.
Grazie Bonzo
Il 28/08/07, Luca G. [email protected] ha scritto:
Basta cercare su Google: rails migration e avrai una infinità di
tutorials.
–
blog: www.lucaguidi.com
Bringing Rails to Italy
First italian Ruby On Rails conference:
Oct, 26-27 2007 - Pisa
www.railstoitaly.org
Aldo I. wrote:
mi allaccio a questa discussione.
Sto imparando ad usare Migration, ho però un dubbio: quando voglio
creare delle nuove colonne su una tabella pre-esistente, posso
specificare la posizione della colonna all’ interno della tabella?
oppure viene creata sempre alla fine?
Non vorrei dire una stupidaggina, anzi sarei contento di esser
contraddetto così imparo una cosa nuova, ma non credo sia possibile
specificare la posizione della nuova colonna.
allora, diciamo che non dovrebbe esserci un metodo per fartelo fare.
Tuttavia esiste il metodo execute che ti permette di eseguire dei
comandi
sql arbitrati, in quel modo puoi specificare ciò che vuoi. Per esempio
execute( “update users set…” )
2008/6/15, Ali P. [email protected]:
mi allaccio a questa discussione.
Sto imparando ad usare Migration, ho però un dubbio: quando voglio
creare delle nuove colonne su una tabella pre-esistente, posso
specificare la posizione della colonna all’ interno della tabella?
oppure viene creata sempre alla fine?