新手问题 关于 rails4 一个数据迁移的问题

gefangshuai · 2013年11月11日 · 最后由 gefangshuai 回复于 2013年11月11日 · 3218 次阅读

在已有的表里添加一个 quantity 字段,类型为 integer,默认值为 1。做法如下:

rails g migration add_quantity_to_line_items quantity:integer

这里没有什么问题,然后修改 migrate 文件,添加一个 default,代码如下:

class AddQuantityToLineItems < ActiveRecord::Migration
  def change
    add_column :line_items, :quantity, :integer, :default => 1
  end
end

rake db:migrate

然后怎么:default => 1 没有生效呢?求指点迷津,谢谢!

忘记补充,数据库是 sqlite3,

写 migration 文件对已有表的已存在的数据不做改动的,你新增的数据会增加这个默认值 1.

最好的办法是除了写这个 migration 文件外,写一个 task,处理下现有的数据。

#2 楼 @hanluner 不行啊,亲,填到数据库里的新记录还是{null}。书上代码是这么写的,

#2 楼 @hanluner 这是老的写法对吧?

#4 楼 @gefangshuai 你的这个还是 migration,还要加一个 task,你去搜一下 task 怎么写吧。

#5 楼 @hanluner 如果是按书本来,这里是新加字段,应该是可以加上 default 的。

rake db:migrate:redo STEP=1

把所有输出贴上来。

#3 楼 @gefangshuai 你写书上的这段代码之后,运行 rake db:migrate 了吗?运行之后,新纪录会产生 1 的默认值

#7 楼 @Rei == AddQuantityToLineItems: reverting ========================================= -- remove_column(:line_items, :quantity, :integer, {:default=>1}) -> 0.0127s == AddQuantityToLineItems: reverted (0.0286s) ================================

== AddQuantityToLineItems: migrating ========================================= -- add_column(:line_items, :quantity, :integer, {:default=>1}) -> 0.0005s == AddQuantityToLineItems: migrated (0.0006s) ================================

奥,没有生效是指新数据还是老数据啊。

#7 楼 @Rei 是的,change 跟 up down 是有区别的。

#10 楼 @Rei #11 楼 @hanluner 新数据也不行,我就是怀疑是不是 change 和 up down 的问题,书上是 up down。我这里用的是 change,只是加了一个 default 而已。我用的 rails4

不是太了解版本是否会对 migration 产生影响。解决不了就去写一个简单地 task 解决问题。但是最好还是去研究下 rails guide

用版本不一致的书和 Rails 学习,后面会有问题,不过这个没看出问题。

进数据库看看

$ sqlite3 db/数据库文件名
> .schema line_items

把结果贴上来。

文件名错了,数据库名字是什么。

如果你要对已有的字段修改 需要开一个新的 migration 修改字段用 change_column

#16 楼 @Rei 刚才是数据库名字错了,现在提示我

#16 楼 @Rei 好了!我莫名其妙把库删了,重新 rake migrate 生成一遍,就有了!

#16 楼 @Rei 不太懂原理,伤不起啊

项目代码 push 到 github 看看。

#21 楼 @Rei 暂时已经搞定了,就是 Agile Web Development with Rails 在学里面 depot 的例子,谢谢啦!!!!

#22 楼 @Rei 还有一个比较弱智的问题,我做 java 开发,每个 model 里定义了各个属性,与表是对应的,但是 rails 中 model 里没有定义相关的属性,我要怎么查看呢?是直接查看数据库吗?因为属性定义多了,记不住都有哪些属性了。谢谢大神!

default: 1 只会为新插入行指定默认的列值。已有行不做处理。对表定义做了变更,数据不会变的。

def up
  add_column ...
  LineItem.update_column(:quantity, 1)
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号