Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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 Heroku Rails数据库迁移文件顺序和关系_Ruby On Rails_Heroku_Ruby On Rails 5_Dbmigrate - Fatal编程技术网

Ruby on rails Heroku Rails数据库迁移文件顺序和关系

Ruby on rails Heroku Rails数据库迁移文件顺序和关系,ruby-on-rails,heroku,ruby-on-rails-5,dbmigrate,Ruby On Rails,Heroku,Ruby On Rails 5,Dbmigrate,我有一个用户模型和一个角色模型。当我开始构建应用程序时,我首先创建用户模型,生成的迁移文件包含对角色的引用: class CreateUsers < ActiveRecord::Migration[5.0] def change create_table :users do |t| t.string :first_name t.string :last_name t.string :username t.string :email

我有一个
用户
模型和一个
角色
模型。当我开始构建应用程序时,我首先创建
用户
模型,生成的迁移文件包含对角色的引用:

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :first_name
      t.string :last_name
      t.string :username
      t.string :email
      t.string :password
      t.string :password_digest
      t.boolean :banned
      t.references :role, foreign_key: true

      t.timestamps
    end
  end
end
我正在尝试部署到Heroku并根据文档使用以下命令迁移我的数据库
Heroku run rails db:migrate
(使用rails 5)

我从Heroku那里得到一个错误,他说:

heroku run rake db:migrate
Running rake db:migrate on ⬢ gentle-headland-79177... up, run.9293 (Free)
D, [2016-12-31T08:15:33.131367 #4] DEBUG -- :    (90.7ms)  CREATE TABLE "schema_migrations" ("version" character varying PRIMARY KEY)
D, [2016-12-31T08:15:33.152682 #4] DEBUG -- :    (11.5ms)  CREATE TABLE "ar_internal_metadata" ("key" character varying PRIMARY KEY, "value" character varying, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL)
D, [2016-12-31T08:15:33.155373 #4] DEBUG -- :    (1.1ms)  SELECT pg_try_advisory_lock(6845940114126317925);
D, [2016-12-31T08:15:33.172106 #4] DEBUG -- :   ActiveRecord::SchemaMigration Load (1.2ms)  SELECT "schema_migrations".* FROM "schema_migrations"
I, [2016-12-31T08:15:33.178453 #4]  INFO -- : Migrating to CreateUsers (20161117083901)
D, [2016-12-31T08:15:33.181903 #4] DEBUG -- :    (0.9ms)  BEGIN
== 20161117083901 CreateUsers: migrating ======================================
-- create_table(:users)
D, [2016-12-31T08:15:33.199351 #4] DEBUG -- :    (13.4ms)  CREATE TABLE "users" ("id" serial primary key, "first_name" character varying, "last_name" character varying, "username" character varying, "email" character varying, "password" character varying, "password_digest" character varying, "banned" boolean, "role_id" integer, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL, CONSTRAINT "fk_rails_642f17018b"
FOREIGN KEY ("role_id")
  REFERENCES "roles" ("id")
)
D, [2016-12-31T08:15:33.200707 #4] DEBUG -- :    (1.0ms)  ROLLBACK
D, [2016-12-31T08:15:33.202190 #4] DEBUG -- :    (1.2ms)  SELECT pg_advisory_unlock(6845940114126317925)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedTable: ERROR:  relation "roles" does not exist
: CREATE TABLE "users" ("id" serial primary key, "first_name" character varying, "last_name" character varying, "username" character varying, "email" character varying, "password" character varying, "password_digest" character varying, "banned" boolean, "role_id" integer, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL, CONSTRAINT "fk_rails_642f17018b"
FOREIGN KEY ("role_id")
  REFERENCES "roles" ("id")
)
据我了解,Heroku似乎希望先定义
角色
,然后再定义
用户

为什么它在我的本地机器上,我可以做db:migrate很好,但在Heroku上失败了

Sqlite3和Postgresql之间的区别可能是什么

如何着手解决此部署问题

我是否只是重命名我的create_角色迁移文件,使其时间戳早于create_用户迁移文件?这是推荐的做法吗D

更新 我将存储库的git克隆到iMac上的桌面文件夹中

然后我在新的本地副本上运行了
railsdb:migrate

没有任何错误。所有数据库迁移都已运行,所有表以及所有关系都已就位。希罗库那边真是一团糟

更新2 再次将我的存储库签出到新的桌面文件夹中,运行
bundle install
,然后尝试此版本的db:migrate命令:

railsdb:migrate rails\u ENV=production

我看到关于角色的相同错误输出不存在

然而

然后我创建了一个全新的rails项目
honey

rails new honey
是否安装了
bundle

然后是:

rails generate model User name:string role:references
最后,我说:

rails db:migrate RAILS_ENV=production
没有错误

我显然没有生成任何
角色
模型,那么为什么它没有失败呢

以下是控制台日志:

Warlocks-iMac:bad clementwu$ cd honey/
Warlocks-iMac:honey clementwu$ ls
Gemfile      Rakefile     config       lib          test
Gemfile.lock app          config.ru    log          tmp
README.md    bin          db           public       vendor
Warlocks-iMac:honey clementwu$ rails generate model User name:string role:references
Running via Spring preloader in process 27200
Expected string default value for '--jbuilder'; got true (boolean)
      invoke  active_record
      create    db/migrate/20170101100613_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
Warlocks-iMac:honey clementwu$ rails db:migrate RAILS_ENV=production
== 20170101100613 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0018s
== 20170101100613 CreateUsers: migrated (0.0018s) =============================

Warlocks-iMac:honey clementwu$ 

创建了数据库,甚至显示了
role\u id
外键,尽管我的生产数据库中没有名为
role
的表:

莫名其妙的:D

更新3 也许这就是sqlite3数据库和postgresql数据库之间的区别

默认情况下,rails应用程序
config/database.yml
指定生产数据库名为
db/production.sqlite3
,也就是说,它不使用PostgreSQL数据库,因此它不会给出角色不存在的错误

根据这篇文章:

SQLite3似乎不能保证引用完整性:(

屁股痛得厉害

这只是一个个人学习项目,不是一个工作项目,这是一件好事

从PostgreSQL开始也不太可行,您不能像使用SQLite3和Rails CLI那样轻松地删除和重新创建数据库

我想这里要学的是认真思考,首先创建依赖表

我是否只是重命名我的create_角色迁移文件,使其时间戳早于create_用户迁移文件?这是建议的做法吗?:D

是的,这对你的案子没问题

但是请记住,在一开始构建系统时,在步骤上这样做是可以的。一旦有了生产数据库,您应该确保在部署之前成功运行迁移

下面是我自己的最佳生产部署实践,仅供将来参考

  • 转储生产数据库。您可以使用

    pg_dump>;scp:./

    以heroku为例,这里很好

  • 将其应用于本地环境中

    psql

  • 尝试运行迁移

  • 如果一切都出错,请转至步骤5,否则请转至步骤6

  • 修复迁移问题,请转至步骤4

  • 检查迁移是否不会损坏数据,如果是,请尝试修复迁移并从步骤2开始,否则只需部署代码;)


  • 我修复了所有的迁移,现在让API在Heroku服务器上运行

    真正的答案是:尽早部署到Heroku,不要等到在本地机器上完成开发后再部署。

    早期部署将尽早发现问题,如SQlite和PostgreSQL之间的迁移差异

    此外,在迁移文件中执行引用时,如果未使用匹配的模型和表名,例如
    作者
    用户
    ,请在运行迁移之前修改迁移文件以使用
    添加外键

    例如:

    class CreateBooks < ActiveRecord::Migration[5.0]
      def change
        create_table :books do |t|
          t.string :title
          t.boolean :adult_content
          t.references :author, foreign_key: true
    
          t.timestamps
        end
      end
    end
    
    class CreateBooks
    需要成为:

    class CreateBooks < ActiveRecord::Migration[5.0]
      def change
        create_table :books do |t|
          t.string :title
          t.boolean :adult_content
          t.references :author, index: true # this line changed
    
          t.timestamps
        end
    
        # new foreign key specifying correct table name and column
        add_foreign_key :books, :users, column: :author_id 
    
      end
    end
    
    class CreateBooks
    从该链接中找到新知识:


    从SQLite迁移到PostgreSQl再迁移到heroku上的deply。

    我有这样的情况,但使用表:出席人数、事件和用户

    PG:无法验证的错误:关系用户不存在

    我解决了这个问题:

  • 本地我运行rails db:drop来本地删除数据库

    • 我有3个迁移文件示例
    • 2019年11月07日20日
    • 2019年11月07日21日5648日创建活动
    • 2019年11月07日22日5648日创建用户
  • 我将前两个文件中的日期更改为:

    • 2019年11月07日22日5648日创建用户
      class CreateBooks < ActiveRecord::Migration[5.0]
        def change
          create_table :books do |t|
            t.string :title
            t.boolean :adult_content
            t.references :author, index: true # this line changed
      
            t.timestamps
          end
      
          # new foreign key specifying correct table name and column
          add_foreign_key :books, :users, column: :author_id 
      
        end
      end