标签: rails-migrations

数据库特定迁移代码

我正在创建一个需要在多个数据库下运行的应用程序.我目前在迁移中有一些代码,我只想在特定的数据库(postgresql和mysql)下运行.有什么方法可以设置吗?谢谢.

mysql migration postgresql ruby-on-rails rails-migrations

2
推荐指数
1
解决办法
226
查看次数

ActiveRecord::Schema.define info :version in schema.rb --> 需要顺序吗?

在 rails db 创建脚本 schema.rb 中,顶部有这一行:

ActiveRecord::Schema.define(:version => 20111127090505) do
Run Code Online (Sandbox Code Playgroud)

文档(http://api.rubyonrails.org/classes/ActiveRecord/Schema.html)说信息哈希参数是可选的

  • 什么是:版本用于?
  • 是否需要在签到时增加这个数字?即,当天晚些时候签入会使版本号下降......
  • 如果有时间戳大于给定的迁移,它们是否会因为它们不在迁移表中而运行,但类文件存在?
  • 迁移文件是否按顺序运行?

ruby-on-rails rails-migrations

2
推荐指数
1
解决办法
1984
查看次数

需要帮助使用Rails将数据库从开发迁移到测试

类似的问题已被问到很多.但是,我认为我的情况有点不同.我从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)

testing ruby-on-rails rails-migrations ruby-on-rails-3

2
推荐指数
1
解决办法
3141
查看次数

pg_dump:在Rails"schema_format =:sql"迁移中"无法连接到服务器"

在我的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)

postgresql ruby-on-rails rails-migrations

2
推荐指数
1
解决办法
7780
查看次数

迁移显示为已关闭但已迁移?

我的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)

ruby-on-rails rails-migrations ruby-on-rails-3

2
推荐指数
1
解决办法
2877
查看次数

将相同的列名添加到不同的表 - Rails迁移

我只是想确定这是否可行:

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)

这样我就可以保存迁移.因为如果我将逐个迁移它们,我认为这将需要更多时间并且使我的迁移陷入困境.所以你怎么看?

是否有可能或者我应该逐一做同样的事情?

ruby-on-rails rails-migrations

2
推荐指数
1
解决办法
1973
查看次数

为Rails 4/Postgres重新排序schema.rb中的列是否安全?

在开发和生产中使用Postgres 9.4运行Rails 4.我有一张随着时间的推移而逐渐迁移的大桌子.由于表中有许多不同的列,我想重新排序,以便更加逻辑地对列进行分组.换句话说,一些列元素基于它们捕获的信息自然地组合在一起.

在此堆栈溢出讨论中,我发现了有关在after:迁移中使用以重新排序列(ALTER TABLE在SQL中使用)的讨论.然后我继续设置迁移来做到这一点.运行迁移后,我注意到我的schema.rb文件没有更改.查看数据库中的列(开发后的postgres),也没有任何改变.

进一步的研究使我进入了Postgres维基,该维基表示目前不支持改变Postgres的柱位.

这不是关键任务,但它会让生活更轻松.我的问题是:

  1. 如果我只是schema.rb向上或向下移动文件中的行以便根据需要定位它们,那会导致任何问题吗?因为我希望使用rake db:schema:load来配置任何新数据库,所以看起来不应该破坏任何东西.此外,由于以前的迁移没有实质性改变(只是它们输出到schema.rb的列的顺序),一切都应该是内部一致的,不是吗?

  2. 如果这是一个坏主意,我可以简单地回到早期的迁移,为after: :some_column每个列元素添加语法,以便他们正确设置schema.rb文件?

我的假设是,当我从头开始使用种子数据重建我的生产数据库时,它将使用模式结构以所需顺序正确创建表.现在它不是一个真正的,部署了最终用户的数据库,所以它似乎不是一个问题.使用上面的选项#1似乎是最简单的解决方案,只要它不会破坏任何东西.

postgresql ruby-on-rails rails-migrations

2
推荐指数
1
解决办法
1396
查看次数

通过引擎引入的 Rails 迁移路径

我有一个 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 应用程序路径中。这是在哪里发生的?有没有办法可以防止我的包目录中的迁移路径包含在应用程序路径中?

ruby-on-rails rails-migrations rails-engines

2
推荐指数
1
解决办法
364
查看次数

为什么我的 add_foreign_key on_delete:: 级联名称没有被转移到模式

为了正确处理 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

2
推荐指数
1
解决办法
1674
查看次数

rails activerecord 迁移中的索引名称太长。尝试手动添加索引,同样的错误

所以我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会做到这一点,但显然不是。

ruby-on-rails rails-migrations

2
推荐指数
1
解决办法
1285
查看次数