2015-10-13 63 views
7

我已經與朋友一起啓動了Rails Spree項目,並且我們使用GitHub進行版本控制。Rails Spree項目 - 無法從Git上的其他貢獻者訪問數據庫

我在我的機器上創建了示例項目,並在其上安裝了Spree功能。這將創建產品樣本數據庫,像這樣:

enter image description here

當我的朋友在克隆他的機器和進口它的項目,運行rails server失敗,MigrationException,並要求他跑rake db:migrate

運行rake db:migrate在非現有數據庫列上進行了一些遷移後失敗。

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) 

之後,再次運行rails server是成功的,但沒有產品或其他物品可以在他的樣本頁面可以看到,像這樣:

enter image description here

必須有一些錯誤數據庫。部分或全部無法訪問,可能是由於安全問題,因爲我們共享數據庫,但我找不到解決方案。或者,也許這只是一個拙劣的遷移問題

任何想法?

+0

你是不是應該有一個在開發中的共享數據庫,種子是要走的路 – apneadiving

回答

6

Rails遷移有時可能會過時與您的實時環境。如果您有單獨的數據庫團隊來更新您的生產環境並忘記爲其進行遷移,則可能會發生這種情況。如果您更新遷移,忘記重新運行它們,或以某種方式進入不一致狀態,也會發生這種情況。

最好方式來做到這一點,是爲一個項目的新開發人員運行rake db:schema:load。這將從您的db/schema.rb文件加載數據庫結構,該文件將盡可能地更新所有內容。之後,您可以運行rake db:migrate只是爲了驗證一切已遷移。

然而,在那之後,你將有數據庫的結構,而不是數據庫的內容。所以說你有一個[email protected]作爲用戶的用戶表。您的同事將擁有一個沒有用戶的用戶表。

爲了解決這個問題,你可以編輯DB/seeds.rb文件。在那裏,你可以做的東西,如:

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) 

這裏的想法是,你創建演示數據,勇敢地站起來並運行和測試的東西,在一個全新數據庫。隨着這一點,rake db:seed將提供足夠的數據來運行應用程序。

如果這還不夠好,並且希望該數據庫爲所有開發者的精確副本,你可以上傳你的SQLite數據庫,並讓每個人下載一個新的副本時,他們拉的數據庫停機。但是,這很難管理,因爲每次有人用新遷移更新master分支時,都需要更新SQLite文件。對於其他數據庫,可以使用pg_dump(Postgres)或mysqldump(MySQL)進行轉儲和恢復。

+0

一個澄清的問題,如果數據庫結構在那裏,爲什麼'db:migrate'失敗並報告缺少的列? –

+0

我的猜測是數據庫文件或遷移歷史記錄存在問題。有時我會寫一個遷移,運行它,改變主意,改變遷移,然後重新運行它。但是,我可能無法將上/下移動作爲完美反轉。或者,某些遷移可能會在一半時間內失敗,並使數據庫處於部分遷移狀態。或者,同事可能會遷移20151027列,但20151026將其刪除並恰好首先部署。當兩個分支合併時,可能會破壞。 –

1

如果你開始與sqlite3的一個新的Rails /大禮包項目你的機器上(我們稱之爲機器A)和你的朋友想使用在機器B相同的代碼,你必須保持一些事情記:

存儲在db/下的.sqlite3文件將由導軌生成器自動添加到.gitignore文件中。

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

所以你的朋友甚至沒有得到數據庫,如果你沒有改變.gitignore(我不推薦,因爲在部署時,你不不希望有您的生產開發的東西服務器)

的工作流程應該是:

  • 您開發的機器A
  • 您提交/更改推
  • 你的朋友拉變化
  • 你的朋友每次拉回購時都會打rake db:migrate
  • (可選)您填充db/seeds.rb與樣本數據和呼叫rake db:seed
  • 當他推你可以做第1-4步讓你的數據庫設置正確

希望這有助於理解