Rails Spree 项目 - Git 上的其他贡献者无法访问数据库

Rails Spree project - Database inaccessible from other contributor on Git

我和一个朋友开始了一个 Rails Spree 项目,我们使用 GitHub 进行版本控制。

我已经在我的机器上创建了示例项目,并在上面安装了 Spree 功能。这将创建一个包含示例产品的数据库,如下所示:

当我的朋友在他的机器上克隆项目并导入它时,运行ning 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)

之后,运行ning rails server再次成功,但是在他的示例页面中看不到任何产品或其他项目,如下所示:

数据库一定有问题。部分或全部无法访问,可能是由于安全问题,因为我们正在共享数据库,但我找不到解决方案。或者这可能只是一个拙劣的迁移问题

有什么想法吗?

Rails 迁移有时会在您的实时环境中过时。如果您有一个单独的数据库团队来更新您的生产环境并忘记为其进行迁移,就会发生这种情况。如果您更新迁移,忘记重新运行它们,或者以某种方式进入不一致的状态,也会发生这种情况。

最好 的方法是让项目的新开发人员 运行 rake db:schema:load。这将从您的 db/schema.rb 文件中加载数据库结构,该文件将包含尽可能最新的所有内容。之后,您可以 运行 rake db:migrate 验证所有内容是否已迁移。

但是,之后你将拥有数据库的结构,但没有数据库的内容。假设您有一个用户 table,用户是 dimitris@example.com。您的同事将有一个用户 table,其中 没有 个用户。

要解决这个问题,您可以编辑 db/seeds.rb 文件。在那里,您可以执行以下操作:

User.create(name: 'Dimitris Sfounis', email: 'dimitris@example.com', password: 'password123')
User.create(name: 'Some Colleague', email: 'colleague@example.com', 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) 进行转储和恢复。

如果你在你的机器(我们称之为机器 A)上用 sqlite3 开始一个新的 rails/spree 项目,而你的朋友想在机器 B 上使用相同的代码,你必须记住一些事情:

db/ 下存储的 .sqlite3 文件由 rails 生成器自动添加到 .gitignore 文件。

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

所以你的朋友甚至没有得到数据库,如果你没有改变 .gitignore(我不推荐,因为在部署时你不希望有开发的东西您的生产服务器)

工作流程应该是:

  • 你开发一台机器A
  • 你commit/push改变
  • 你的朋友拉取更改
  • 你的朋友每次拉回回购时都会打电话给 rake db:migrate
  • (可选)您使用示例数据填充 db/seeds.rb 并调用 rake db:seed
  • 当他推动时,您可以执行步骤 1-4 以正确设置数据库

希望这有助于理解