【问题标题】:Rails 4 SQLite3::SQLException errorRails 4 SQLite3::SQLException 错误
【发布时间】:2014-03-25 01:50:24
【问题描述】:

我有一个设计用户模型,我想添加一个管理员布尔字段,所以我运行了

rails generate migration add_admin_to_users admin:boolean 创建了以下迁移

class AddAdminToUsers < ActiveRecord::Migration
 def change
  add_column :users, :admin, :boolean
 end
end

但是,当我运行 rake db:migrate 时,我不断收到以下错误

SQLite3::SQLException: no such table: users: ALTER TABLE "users" ADD "admin" boolean/home/notebook/.rvm/gems/ruby-2.0.0-p353/gems/sqlite3-1.3 .8/lib/sqlite3/database.rb:91:in `initialize'

我已尝试 rake db:migrate VERSION=0 以回滚到开头并重做 rake db:migrate 但我一直收到相同的错误

这是我的用户模型迁移文件

class DeviseCreateUsers < ActiveRecord::Migration
  def change
   create_table(:users) do |t|
  ## Database authenticatable
  t.string :email,              :null => false, :default => ""
  t.string :encrypted_password, :null => false, :default => ""

  ## Recoverable
  t.string   :reset_password_token
  t.datetime :reset_password_sent_at

  ## Rememberable
  t.datetime :remember_created_at

  ## Trackable
  t.integer  :sign_in_count, :default => 0, :null => false
  t.datetime :current_sign_in_at
  t.datetime :last_sign_in_at
  t.string   :current_sign_in_ip
  t.string   :last_sign_in_ip

  ## Confirmable
  t.string   :confirmation_token
  t.datetime :confirmed_at
  t.datetime :confirmation_sent_at
  t.string   :unconfirmed_email # Only if using reconfirmable

  ## Lockable
  # t.integer  :failed_attempts, :default => 0, :null => false # Only if lock strategy is :failed_attempts
  # t.string   :unlock_token # Only if unlock strategy is :email or :both
  # t.datetime :locked_at
  t.timestamps
end

add_index :users, :email,                :unique => true
add_index :users, :reset_password_token, :unique => true
add_index :users, :confirmation_token,   :unique => true
# add_index :users, :unlock_token,         :unique => true
end
end

我的db/schema.rb文件如下:

ActiveRecord::Schema.define(version: 20140217093954) do
  create_table "entities", force: true do |t|
   t.string   "entity"
   t.string   "genre"
   t.string   "url"
   t.datetime "created_at"
   t.datetime "updated_at"
end

   add_index "entities", ["entity"], name: "index_entities_on_entity", unique: true

结束

【问题讨论】:

    标签: ruby-on-rails sqlite activerecord


    【解决方案1】:

    听起来您的开发数据库与架构(或您认为的架构)不同步。运行数据库迁移旨在进行增量更改,而不是作为回滚数据库并从第一次迁移开始运行的一种方式。为此,您想使用rake db:reset,它将删除数据库并从 db/schema 加载模式。 This post 很好地概述了不同的数据库 rake 命令。

    【讨论】:

    • 我也试过了,然后运行 ​​rake db:migrate 但我一直收到同样的错误
    • @Mutuma 你的 db/schema 文件中有用户表吗?
    • 我有 13 个模型,并且我的架构文件仅指示我搭建了一个模型,但是当我删除脚手架时,架构中的任何内容都没有改变。让我发布 schema.rb 文件
    • 看起来您没有运行某些迁移。如果你执行“rake db:drop && rake db:migrate”会发生什么?
    • 我刚刚删除了数据库并迁移了迁移,它工作了
    【解决方案2】:

    你的数据库没有users表,需要先创建users表:

    rails g migration create_users
    

    并将该迁移放在您现在尝试运行的迁移之前,即更改其时间戳。

    一个更简单的选择是添加您当前的文件:

    class AddAdminToUsers < ActiveRecord::Migration
     def change
      create_table :users
      add_column :users, :admin, :boolean
     end
    end
    

    无论您应用哪种解决方案,您的迁移顺序都有问题,请在 migrate 文件夹中搜索实际创建 users 表的迁移。

    【讨论】:

    • 我使用命令 rails g model Users 创建了一个用户表
    • 请发布创建该表的迁移文件,这样我们可以确定迁移存在。
    • 我已经使用类似的命令将用户名字段添加到同一个表中,只是我使用用户名而不是管理员和字符串作为字段类型,并且效果很好
    • 问题可能是迁移的时间戳,检查文件xxx_create_users中的数字是否大于xxx_add_admin_to_usersxxx是数字
    • admin迁移的文件名为20140223152952_add_admin_to_users.rb,用户模型的文件名为20140211193312_devise_create_users.rb
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多