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

Dim*_*nis 7 rake ruby-on-rails spree

Ι与朋友一起开始了Rails Spree项目,我们使用GitHub进行版本控制.

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

在此输入图像描述

当我的朋友在他的机器中克隆项目并导入它时,运行rails server失败MigrationException并要求他运行rake db:migrate.

rake db:migrate在一些迁移之后,在不存在的db列上运行失败.

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)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

有任何想法吗?

Ben*_*nns 6

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

执行此操作的最佳方法是让项目的新开发人员运行rake db:schema:load.这将从db/schema.rb文件加载数据库结构,该文件将使所有内容尽可能保持最新.之后,您可以rake db:migrate只运行以验证所有迁移的内容.

但是,在此之后,您将拥有数据库的结构,但不具有数据库的内容.所以说你有一个用户表dimitris@example.com作为用户.您的同事将拥有一个没有用户的用户表.

要解决此问题,您可以编辑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)
Run Code Online (Sandbox Code Playgroud)

这里的想法是,你创建演示的数据,勇敢地站起来并运行和测试的东西全新数据库.有了这个,rake db:seed将提供足够的数据来运行应用程序.

如果这还不够好,并且您需要为所有开发人员准确复制数据库,则可以上传SQLite数据库并让他们每个人在下拉数据库时下载新副本.但是,这很难管理,因为每次有人使用新迁移更新主分支时,您都需要更新SQLite文件.对于其他数据库,可以使用pg_dump(Postgres)或mysqldump(MySQL)进行转储和恢复.