2015-10-13 7 views
7

Ι hanno avviato un progetto Rails Spree insieme ad un amico, e usiamo GitHub per il controllo della versione.Progetto Rails Spree - Database inaccessibile da altri contributori su Git

Ho creato il progetto di esempio nella mia macchina e installato la funzionalità Spree. Questo crea un database con prodotti campione, in questo modo:

enter image description here

Quando il mio amico cloni il progetto nella sua macchina e l'importa, in esecuzione rails server fallisce con MigrationException e gli chiede di eseguire rake db:migrate.

L'esecuzione di rake db:migrate non riesce dopo alcune migrazioni, nella colonna db non esistente.

rake aborted! 
StandardError: An error has occurred, this and all later migrations canceled: 

SQLite3::SQLException: no such column: spree_calculators.deleted_at: SELECT "spree_calculators".* FROM "spree_calculators" WHERE "spree_calculators"."deleted_at" IS NULL ORDER BY "spree_calculators"."id" ASC LIMIT 1000C:in `find_each' 
C:/Users/User/xylino/xylino_serena/db/migrate/20151011115236_migrate_old_preferences.spree.rb:15:in `migrate_preferences' 
C:/Users/User/xylino/xylino_serena/db/migrate/20151011115236_migrate_old_preferences.spree.rb:4:in `up' 
C:in `migrate' 
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: spree_calculators.deleted_at: SELECT "spree_calculators".* FROM "spree_calculators" WHERE "spree_calculators"."deleted_at" IS NULL ORDER BY "spree_calculators"."id" ASC LIMIT 1000 
C:in `find_each' 
C:/Users/User/xylino/xylino_serena/db/migrate/20151011115236_migrate_old_preferences.spree.rb:15:in `migrate_preferences' 
C:/Users/User/xylino/xylino_serena/db/migrate/20151011115236_migrate_old_preferences.spree.rb:4:in `up' 
C:in `migrate' 
SQLite3::SQLException: no such column: spree_calculators.deleted_at 
C:in `find_each' 
C:/Users/User/xylino/xylino_serena/db/migrate/20151011115236_migrate_old_preferences.spree.rb:15:in `migrate_preferences' 
C:/Users/User/xylino/xylino_serena/db/migrate/20151011115236_migrate_old_preferences.spree.rb:4:in `up' 
C:in `migrate' 
Tasks: TOP => db:migrate 
(See full trace by running task with --trace) 

Dopo di che, in esecuzione rails server ancora una volta è successo, ma nessun prodotto o altri oggetti può essere visto nella sua pagina di esempio, in questo modo:

enter image description here

ci deve essere qualcosa di sbagliato con il database. Parti o tutto questo sono inaccessibili, probabilmente a causa di problemi di sicurezza perché stiamo condividendo il db, ma non riesco a trovare una soluzione. O forse è solo un problema di migrazione pasticciato

Qualche idea?

+0

non si è supponendo di avere un db condiviso in sviluppo, i semi sono la strada da percorrere – apneadiving

risposta

6

Le migrazioni delle rotaie possono talvolta non essere più aggiornate con il proprio ambiente. Questo può accadere se hai un team di database separato che aggiorna il tuo ambiente di produzione e dimentica di effettuare una migrazione per esso. Può anche accadere se aggiorni le tue migrazioni, dimentichi di rieseguirle o in qualche modo ottenere uno stato incoerente.

Il migliore modo per farlo, è per un nuovo sviluppatore su un progetto da eseguire rake db:schema:load. Questo caricherà la struttura del database dal tuo file db/schema.rb, che avrà tutto quanto più aggiornato possibile. Successivamente, è possibile eseguire rake db:migrate solo per verificare che tutto sia migrato.

Tuttavia, dopo di che, si avrà la struttura di del database, ma non il contenuto di del database. Quindi dì che hai una tabella utenti con [email protected] come utente. Il tuo collega avrà una tabella utenti con senza utenti.

Per risolvere il problema, è possibile modificare il file db/seeds.rb. Lì, si può fare cose del genere:

User.create(name: 'Dimitris Sfounis', email: '[email protected]', password: 'password123') 
User.create(name: 'Some Colleague', email: '[email protected]', password: 'password123') 
Product.create(name: 'Ruby on Rails Tote', price: 15.99) 
Product.create(name: 'Ruby on Rails Bag', price: 22.99) 

L'idea è di creare demo dati, abbastanza per ottenere installato e funzionante e roba test in un nuovo e vuoto database. Con quello sul posto, rake db:seed fornirà abbastanza dati per eseguire l'app.

Se ciò non è sufficiente e si desidera una copia esatta del database per tutti gli sviluppatori, è possibile caricare il database SQLite e scaricare ciascuno una nuova copia quando si estrae il database.Tuttavia, è difficile da gestire, perché ogni volta che qualcuno aggiorna il ramo master con una nuova migrazione, è necessario aggiornare il file SQLite. Per altri database, è possibile eseguire il dump e il ripristino con pg_dump (Postgres) o mysqldump (MySQL).

+0

Una domanda per chiarimenti, se la struttura del DB è presente, perché 'db: migrate' fallisce e riporta una colonna mancante? –

+0

La mia ipotesi è che ci sia un problema con i file di database o con la cronologia di migrazione. A volte scriverò una migrazione, eseguirla, cambiare idea, modificare la migrazione e rieseguirla. Tuttavia, potrei non ottenere che la migrazione up/down funzioni come inversioni perfette. Oppure, alcune migrazioni potrebbero fallire a metà e lasciare il DB in uno stato parzialmente migrato. Oppure, un collega potrebbe avere una migrazione 20151027 che modifica le colonne, ma 20151026 le rimuove e accade di essere distribuita prima. Quando i due rami si uniscono, le cose potrebbero rompersi. –

1

Se si avvia un progetto di nuove rotaie/baldoria con sqlite3 sulla vostra macchina (chiamiamolo macchina A) e il tuo amico vuole utilizzare lo stesso codice sulla macchina B devi tenere a mente alcune cose:

I file .sqlite3 archiviati in db/ vengono aggiunti automaticamente al file .gitignore dal generatore di rails.

... 
# Ignore the default SQLite database. 
/db/*.sqlite3 
/db/*.sqlite3-journal 
... 

Così il vostro amico non ha nemmeno ottenere il database, se non è stato modificato .gitignore (che non consiglio, perché quando la distribuzione non si non si vuole avere la roba di sviluppo sulla vostra produzione server)

Il flusso di lavoro dovrebbe essere:

  • a sviluppare una macchina A
  • Vi impegnate/push cambia
  • Il tuo amico tira cambiamenti
  • Il tuo amico chiama ogni volta che ha tirato il pronti contro termine.
  • (opzionalmente) si popolano db/seeds.rb con dati di esempio e chiamare rake db:seed
  • quando spinge si può fare passi 1-4 per avere la configurazione del database correttamente

Spero che questo aiuti la comprensione

Problemi correlati