Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails Spree项目-无法从Git上的其他参与者访问数据库_Ruby On Rails_Rake_Spree - Fatal编程技术网

Ruby on rails Rails Spree项目-无法从Git上的其他参与者访问数据库

Ruby on rails Rails Spree项目-无法从Git上的其他参与者访问数据库,ruby-on-rails,rake,spree,Ruby On Rails,Rake,Spree,我和一位朋友一起启动了一个Rails Spree项目,我们使用GitHub进行版本控制 我已经在我的机器中创建了示例项目,并在其上安装了Spree功能。这将创建一个包含示例产品的数据库,如下所示: 当我的朋友在他的机器中克隆项目并导入它时,运行rails服务器失败,出现MigrationException并要求他运行rake db:migrate 在不存在的db列上运行rake db:migrate在几次迁移后失败 rake aborted! StandardError: An error h

我和一位朋友一起启动了一个Rails Spree项目,我们使用GitHub进行版本控制

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

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

在不存在的db列上运行
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服务器
是成功的,但在他的示例页面中看不到任何产品或其他项目,如下所示:

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


有什么想法吗?

Rails迁移有时会与您的实时环境格格不入。如果您有一个单独的数据库团队更新您的生产环境,而忘记对其进行迁移,则可能会发生这种情况。如果您更新迁移,忘记重新运行迁移,或者以某种方式处于不一致的状态,也可能发生这种情况

最好的方法是让项目中的新开发人员运行
rakedb:schema:load
。这将从您的db/schema.rb文件加载数据库结构,该文件将使所有内容尽可能最新。之后,您可以运行
rakedb: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)
这里的想法是创建演示数据,足以在全新的空数据库中启动、运行和测试数据。有了它,
rakedb:seed
将提供足够的数据来运行应用程序


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

如果您在您的机器上启动一个新的rails/spree项目,使用sqlite3(我们称之为机器a),并且您的朋友希望在机器B上使用相同的代码,您必须记住以下几点:

rails生成器会自动将存储在
db/
下的.sqlite3文件添加到
.gitignore
文件中

...  
# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal
...
因此,如果您不更改
.gitignore
(我不建议这样做,因为在部署时,您不希望在生产服务器上安装开发工具),那么您的朋友甚至无法获取数据库

工作流程应为:

  • 你开发了一台机器
  • 您可以提交/推送更改
  • 你的朋友在找零钱
  • 你的朋友每次拉回购时都会调用rake db:migrate
  • (可选)使用示例数据填充
    db/seed.rb
    ,并调用
    rake db:seed
  • 当他按下按钮时,您可以执行步骤1-4以正确设置数据库

希望这有助于理解

您不应该在开发中使用共享数据库,种子是解决问题的方法,如果数据库结构存在,为什么
db:migrate
会失败并报告缺少的列?我猜是数据库文件或迁移历史有问题。有时我会编写迁移,运行迁移,改变主意,更改迁移,然后重新运行迁移。但是,我可能无法将上/下迁移作为完美的反向工作。或者,某些迁移可能中途失败,使数据库处于部分迁移状态。或者,同事可能需要迁移20151027来更改列,但20151026会删除这些列,并碰巧首先部署。当两个分支合并时,东西可能会断裂。