1

我一直在为正在开发的数据库使用 sqlite3,并且我的应用程序已经变得足够复杂,以至于使用起来有点慢。

我刚刚切换到 MySQL 并运行rake db:create ; rake db:migrate,但我的一个迁移失败并显示以下错误消息:

undefined method `alter_table` for #<ActiveRecord::ConnectionAdapters::MysqlAdapter:0xb6e6088c>

我有一个快速的谷歌,并没有出现。然后我检查了 API 并没有记录方法alter_table。但是,它确实适用于 sqlite3!

这是我的迁移:

class AddSettingsToUsers < ActiveRecord::Migration
  def self.up
    alter_table :users do |t|
      t.text signature
      ...
    end
  end

  ...

end

这与 sqlite3 一样工作。

我要疯了吗?我是否只是发明了这种方法,而它恰好是一个未记录的功能,仅适用于受支持的数据库的子集?

有没有人对此有所了解?

4

4 回答 4

3

正如其他人提到的,这可能是一种仅用于 sqlite 的方法。文档提到了change_table,所以改用那个,它应该以相同的方式工作:

class AddSettingsToUsers < ActiveRecord::Migration
  def self.up
    change_table :users do |t|
      t.text :signature
      ...
    end
  end

  ...

end
于 2009-12-27T23:52:01.240 回答
2

它似乎是 sqlite 独有的

yvaine:activerecord-2.3.5 root# find . -type f -exec grep -l alter_table {} \;

./lib/active_record/connection_adapters/sqlite_adapter.rb

改用 change_column 方法可能会更安全,因为它抽象了 alter table 方法。

于 2009-12-27T23:44:56.400 回答
1

表明alter_tableSqlite 适配器中有一个受保护的方法。

于 2009-12-27T23:35:07.760 回答
0

关于常规表达式操作,我有不同的 java 适配器到 sqlite 处理程序。也许 rails 并没有完全统治适配器。

于 2011-11-13T23:20:59.347 回答