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
我修复了所有的迁移,现在让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:无法验证的错误:关系用户不存在 我解决了这个问题:
- 我有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