我正在创建一个需要在多个数据库下运行的应用程序.我目前在迁移中有一些代码,我只想在特定的数据库(postgresql和mysql)下运行.有什么方法可以设置吗?谢谢.
在 rails db 创建脚本 schema.rb 中,顶部有这一行:
ActiveRecord::Schema.define(:version => 20111127090505) do
Run Code Online (Sandbox Code Playgroud)
文档(http://api.rubyonrails.org/classes/ActiveRecord/Schema.html)说信息哈希参数是可选的
类似的问题已被问到很多.但是,我认为我的情况有点不同.我从Heroku(我在prod中使用sqlite3)向我的本地机器(使用PostgreSQL)中提取了一个数据库.prod db当时没有任何数据.
在那之后,我还没有进行任何db迁移来测试.现在我在dev db中有几个字段.但是,当我去测试控制台看看我有什么(引用User表)时,User.count返回0,但在dev中返回2个用户.
所以我做了rake db:migrate RAILS_ENV=test既没有错误信息也没有成功信息.我认为这是成功的,并检查测试数据库是否有这2个用户,但仍然没有.然后我试了一下bundle exec rake db:test:prepare.这是输出
**You have 4 pending migrations:
20120415210441 CreateUsers
20120418064930 AddIndexToUsersEmail
20120419034627 AddPasswordDigestToUsers
20120504031144 AddRememberTokenToUsers
Run `rake db:migrate` to update your database then try again.**
Run Code Online (Sandbox Code Playgroud)
解决办法是什么?
编辑: 仅供参考:我正在使用Windows我也运行rake db:migrate 并且我收到了此错误.
$ rake db:migrate
== CreateUsers: migrating ====================================================
-- create_table(:users)
rake aborted!
An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: table "users" already exists: CREATE TABLE "users" ("id"
INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), …Run Code Online (Sandbox Code Playgroud) 在我的rails app(v 3.2.8)中,到目前为止,我已经使用了迁移而没有任何问题.
我使用PostgreSQL 9.2作为数据库.我调整了我application.rb使用sql而不是模式转储器(取消注释config.active_record.schema_format = :sql).
之后,我开始在迁移时遇到此错误:
$ rake db:migrate
[ALL MIGRATION STUFF IS PRINTED HERE]
pg_dump: [archiver (db)] connection to database "my_dev_db" failed: could not connect to server: Connection refused
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Connection refused …Run Code Online (Sandbox Code Playgroud) 我的rails应用程序有一些迁移.当我点击rake db:migrate:status以查看设置了什么状态时,所有状态********** NO FILE **********都已关闭.但是已经进行了迁移,因此模型方面似乎没有问题.这些文件可能有助于解释:
产量rake db:migrate:status:
up 20130727003912 ********** NO FILE **********
down 20130728000151 Devise create users
down 20130728000335 Create friends
down 20130728000346 Create addresses
down 20130728000356 Create authies
down 20130728000413 Add indexes
Run Code Online (Sandbox Code Playgroud)
这时,rake db:migrate输出:
== DeviseCreateUsers: migrating ==============================================
-- create_table(:users)
NOTICE: CREATE TABLE will create implicit sequence "users_id_seq1" for serial column "users.id"
rake aborted!
An error has occurred, this and all later migrations canceled:
PG::DuplicateTable: ERROR: relation "users" already exists …Run Code Online (Sandbox Code Playgroud) 我只是想确定这是否可行:
class AddUpdatedById < ActiveRecord::Migration
def change
add_column :clients, :updated_by_id, :integer
add_column :contacts, :updated_by_id, :integer
add_column :court_agencies, :updated_by_id, :integer
end
end
Run Code Online (Sandbox Code Playgroud)
这样我就可以保存迁移.因为如果我将逐个迁移它们,我认为这将需要更多时间并且使我的迁移陷入困境.所以你怎么看?
是否有可能或者我应该逐一做同样的事情?
在开发和生产中使用Postgres 9.4运行Rails 4.我有一张随着时间的推移而逐渐迁移的大桌子.由于表中有许多不同的列,我想重新排序,以便更加逻辑地对列进行分组.换句话说,一些列元素基于它们捕获的信息自然地组合在一起.
在此堆栈溢出讨论中,我发现了有关在after:迁移中使用以重新排序列(ALTER TABLE在SQL中使用)的讨论.然后我继续设置迁移来做到这一点.运行迁移后,我注意到我的schema.rb文件没有更改.查看数据库中的列(开发后的postgres),也没有任何改变.
进一步的研究使我进入了Postgres维基,该维基表示目前不支持改变Postgres的柱位.
这不是关键任务,但它会让生活更轻松.我的问题是:
如果我只是schema.rb向上或向下移动文件中的行以便根据需要定位它们,那会导致任何问题吗?因为我希望使用rake db:schema:load来配置任何新数据库,所以看起来不应该破坏任何东西.此外,由于以前的迁移没有实质性改变(只是它们输出到schema.rb的列的顺序),一切都应该是内部一致的,不是吗?
如果这是一个坏主意,我可以简单地回到早期的迁移,为after: :some_column每个列元素添加语法,以便他们正确设置schema.rb文件?
我的假设是,当我从头开始使用种子数据重建我的生产数据库时,它将使用模式结构以所需顺序正确创建表.现在它不是一个真正的,部署了最终用户的数据库,所以它似乎不是一个问题.使用上面的选项#1似乎是最简单的解决方案,只要它不会破坏任何东西.
我有一个 rails 应用程序,它通过在 Gemfile 中显式声明来运行一个 rails 引擎。我设置了一个脚本来通过以下方式安装来自引擎的迁移:rake railties:install:migrations然后迁移。当我运行脚本时,会安装迁移,但在运行迁移时出现 DuplicateMigration 错误。我进一步调查了这一点,看到
Rails.application.paths['db/migrate'].to_a
导致:
["/src/db/migrate","/bundle/bundler/gems/my_engine-w8ejw9jf/db/migrate"]
不知何故,来自 bundle 目录的迁移路径被添加到 Rails 应用程序路径中。这是在哪里发生的?有没有办法可以防止我的包目录中的迁移路径包含在应用程序路径中?
为了正确处理 Postgres 的 ForeignKeyViolation 警告,我检查了我的每个模型并添加了 on_delete: 命令,如下所示。
我遵循的格式是
add_foreign_key <:named_table>, <:related_table>, on_delete: :cascade
但是,在进行这些更改并运行后,rails db:reset我注意到这些额外的参数没有传递到生成的 schema.rb 文件中,并且在尝试删除图像时仍然收到上述错误。
我的程序或语法有什么问题吗?先感谢您!
12345_create_document_images.rb
class CreateDocumentImages < ActiveRecord::Migration[5.1]
def change
create_table :document_images do |t|
t.references :document, foreign_key: true
t.references :image, foreign_key: true
t.timestamps
end
add_foreign_key :document_images, :documents, on_delete: :cascade
add_foreign_key :document_images, :images, on_delete: :cascade
end
end
Run Code Online (Sandbox Code Playgroud)
模式文件
add_foreign_key "document_images", "images"
add_foreign_key "document_images", "documents"
Run Code Online (Sandbox Code Playgroud) postgresql ruby-on-rails rails-migrations ruby-on-rails-5 postgresql-9.6
所以我name在添加索引时通过使用参数成功创建了连接表,但我不确定为什么当我尝试创建新迁移时这不起作用:
class CreateVMailCampaignScheduleHours < ActiveRecord::Migration[5.1]
def change
create_table :v_mail_campaign_schedule_hours do |t|
t.belongs_to :v_mail_campaign_schedule, foreign_key: true
t.string :day
t.time :start_hours
t.time :stop_hours
t.timestamps
end
add_index [:v_mail_campaign_schedule_hours, :v_mail_campaign_schedule_id], name: :v_mail_campaign_schedule_id
end
end
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
ArgumentError:表“v_mail_campaign_schedule_hours”上的索引名称“index_v_mail_campaign_schedule_hours_on_v_mail_campaign_schedule_id”太长;限制为 64 个字符
有什么建议?我以为我add_index会做到这一点,但显然不是。