我一直在项目中的分支之间切换,每个分支都有不同的迁移...这是场景:
$ rake db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
...
up 20130307154128 Change columns in traffic capture
up 20130311155109 Remove log settings
up 20130311160901 Remove log alarm table
up 20130320144219 ********** NO FILE **********
up 20130320161939 ********** NO FILE **********
up 20130320184628 ********** NO FILE **********
up 20130322004817 Add replicate to root settings
up 20130403190042 ********** NO FILE **********
up 20130403195300 ********** NO FILE **********
up 20130403214000 ********** NO FILE **********
up 20130405164752 Fix ap hostnames
up 20130410194222 ********** …Run Code Online (Sandbox Code Playgroud) migration git ruby-on-rails rails-migrations ruby-on-rails-3
目前,如果books表没有created_at或updated_at字段,当前迁移可能会失败:
class AddTimestampIndexes < ActiveRecord::Migration
def up
remove_index :books, :created_at
remove_index :books, :updated_at
add_index :books, :created_at
add_index :books, :updated_at
end
def down
remove_index :books, :created_at
remove_index :books, :updated_at
end
end
Run Code Online (Sandbox Code Playgroud)
remove_index如果无法删除索引而不是引发错误,是否采取任何选项以静默方式继续?
通过Rails迁移定义固定长度SQL列(例如CHAR(12))的最佳方法是什么?
为什么这不应该由模型处理是因为CHAR()与VARCHAR()的表现,我想,以避免在数据库中注入原始的SQL.
编辑:我知道:limit修饰符,但是该字段仍然是varchar(这对性能有害)并且不允许最小大小.
我今天制作了一个新的Rails 3应用程序,添加了一个简单的迁移,并且出于某种原因,当我执行rake db:migrate时没有任何反应.它只是暂停几秒钟,然后返回到命令提示符,没有任何错误或任何错误.Schema.rb和数据库保持空白.
什么想法可能会发生什么?我做了很多应用程序,从来没有遇到过这个问题.一切都是完全标准的设置.
rake activerecord ruby-on-rails rails-migrations ruby-on-rails-3
我在rails应用程序中使用rails generate migrations命令创建了一个表.这是迁移文件:
class CreateListings < ActiveRecord::Migration
def change
create_table :listings do |t|
t.string :name
t.string :telephone
t.string :latitude
t.string :longitude
t.timestamps
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后我想将纬度和经度存储为整数,所以我试图运行:
rails generate migration changeColumnType
Run Code Online (Sandbox Code Playgroud)
并且该文件的内容是:
class ChangeColumnType < ActiveRecord::Migration
def up
#change latitude columntype from string to integertype
change_column :listings, :latitude, :integer
change_column :listings, :longitude, :integer
#change longitude columntype from string to integer type
end
def down
end
end
Run Code Online (Sandbox Code Playgroud)
我期待列类型改变但是rake被中止并且出现以下错误消息.我想知道为什么这不通过?我在我的应用程序中使用postgresql.
rake db:migrate
== ChangeColumnType: migrating ===============================================
-- change_column(:listings, :latitude, :integer)
rake aborted!
An error …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以将默认值传递给rails g migration命令.就像是:
$ rails generate migration add_disabled_to_users disabled:boolean:false #where false is default value for disabled attribute
Run Code Online (Sandbox Code Playgroud)
为了生成:
class AddDisabledToUsers < ActiveRecord::Migration
def change
add_column :users, :disabled, :boolean, default: false
end
end
Run Code Online (Sandbox Code Playgroud) 我已经看到很多为Rails应用程序制作Docker容器的例子.通常,他们运行rails服务器并拥有运行迁移/设置的CMD,然后启动Rails服务器.
如果我同时生成其中5个容器,Rails如何处理尝试启动迁移的多个进程?我可以看到Rails检查通用查询日志中的当前模式版本(它是一个MySQL数据库):
SELECT `schema_migrations`.`version` FROM `schema_migrations`
Run Code Online (Sandbox Code Playgroud)
但是如果在不同的Rails实例上同时发生这种情况,我可以看到竞争条件.
考虑到DDL在MySQL中不是事务性的,并且我在运行迁移时看不到通用查询日志中发生任何锁定(除了每次迁移事务),看起来并行启动它们是个坏主意.事实上,如果我在本地启动三次,我可以看到两个rails实例在尝试创建表时崩溃,因为它已经存在,而第三个rails实例很快就完成了迁移.如果这是一个将某些东西插入数据库的迁移,那将是非常不安全的.
那么运行一个运行迁移/设置的单个容器然后产生(例如)一个Unicorn实例然后生成多个rails工作人员会更好吗?
我是否应该产生N个轨道容器和一个运行迁移的"迁移容器"然后退出?
有更好的选择吗?
mysql ruby-on-rails database-migration rails-migrations docker
我需要将一些列从一个现有表移动到另一个表.如何使用rails迁移执行此操作?
class AddPropertyToUser < ActiveRecord::Migration
def self.up
add_column :users, :someprop, :string
remove_column :profiles, :someprop
end
def self.down
add_column :profiles, :someprop, :string
remove_column :users, :someprop
end
end
Run Code Online (Sandbox Code Playgroud)
以上只是创建新列,但值保持为空...
我想避免登录到数据库以手动更新表.
如果有一种以编程方式移动列值的方法,那么性能特征是什么?它会逐行进行,还是有办法批量更新?
我非常喜欢Rails 3样式的迁移,即一种change智能足以识别迁移是否正在安装或回滚的方法,因此我不必编写up和down方法相互镜像.但我有一种情况,我需要在回滚迁移时跳过一些代码(更新counter_cache我正在添加的列).
我查看了http://guides.rubyonrails.org/migrations.html,但第5节末尾的示例遇到了同样的问题:
class AddFuzzToProduct < ActiveRecord::Migration
class Product < ActiveRecord::Base
end
def change
add_column :products, :fuzz, :string
Product.reset_column_information
Product.all.each { |f| f.update_attributes! :fuzz => 'fuzzy' }
end
end
Run Code Online (Sandbox Code Playgroud)
回滚此迁移时,fuzz不需要更新字段.有没有办法防止它?
我尝试过Product.column_names但是由于Rails足够智能以反向执行迁移,因此在删除列之前执行更新.此外,当change定义方法时,似乎忽略任何up或down方法.还有其他想法吗?
rails-migrations ×10
migration ×2
activerecord ×1
casting ×1
docker ×1
git ×1
mysql ×1
postgresql ×1
rake ×1
ruby ×1
sql ×1