`Sequel::Error: mismatched number of keys` when migration run from rake
`Sequel::Error: mismatched number of keys` when migration run from rake
我有一个使用 Sequel 的 Sinatra 应用程序和一个执行迁移的 rake 任务。当我 运行 rake db:migrate
我得到以下错误:
rake aborted!
Sequel::Error: mismatched number of keys: [:rows, :cols] vs [:id]
<path_to_project>/models/grid_pattern.rb:4:in `<class:GridPattern>'
解决方法是在我的应用程序文件中暂时注释掉需要我的模型的这一行:
Dir.glob('./{models}/*.rb').each { |file| require file }
我在 Sequel 中知道我不应该在迁移中依赖模型,但是我怎样才能避免这种情况,因为我的应用程序需要模型而 rake 任务需要应用程序?
我的模型是这样的:
# grid pattern
class GridPattern < Sequel::Model
unrestrict_primary_key
one_to_many :widgets, key: [:rows, :cols]
end
关联的小部件模型:
class Widget < Sequel::Model
many_to_one :grid_pattern, key: [:rows, :cols]
...
Rakefile:
namespace :db do
desc 'Migrate DB [to version]'
task :migrate, [:version] do |_t, args|
ARGV.each { |a| task a.to_sym }
RACK_ENV = ARGV[1] if ARGV[1]
require_relative 'app' # DB now set as per RACK_ENV
db_name = URI(settings.database).path[1..-1]
if args[:version]
puts "Migrating '#{db_name}' to version #{args[:version]}"
Sequel::Migrator.run(DB, 'db/migrations', target: args[:version].to_i)
else
puts "Migrating '#{db_name}' to latest"
Sequel::Migrator.run(DB, 'db/migrations')
end
end
end
迁移文件:
...
create_table :grid_patterns do
Integer :row
Integer :col
primary_key [:row, :col], name: :grids_pk
end
create_table :widgets do
primary_key :id
Integer :rows
Integer :cols
foreign_key [:rows, :cols], :grid_patterns, name: 'challenges_grid_fkey'
end
...
我该如何解决这个问题?
您的迁移不需要您的 application/model 代码,它们只需要正确设置 DB
。修改您的应用程序代码,以便您可以需要一个单独的文件来设置 DB
,然后在 运行 迁移时仅加载该文件。
我有一个使用 Sequel 的 Sinatra 应用程序和一个执行迁移的 rake 任务。当我 运行 rake db:migrate
我得到以下错误:
rake aborted!
Sequel::Error: mismatched number of keys: [:rows, :cols] vs [:id]
<path_to_project>/models/grid_pattern.rb:4:in `<class:GridPattern>'
解决方法是在我的应用程序文件中暂时注释掉需要我的模型的这一行:
Dir.glob('./{models}/*.rb').each { |file| require file }
我在 Sequel 中知道我不应该在迁移中依赖模型,但是我怎样才能避免这种情况,因为我的应用程序需要模型而 rake 任务需要应用程序?
我的模型是这样的:
# grid pattern
class GridPattern < Sequel::Model
unrestrict_primary_key
one_to_many :widgets, key: [:rows, :cols]
end
关联的小部件模型:
class Widget < Sequel::Model
many_to_one :grid_pattern, key: [:rows, :cols]
...
Rakefile:
namespace :db do
desc 'Migrate DB [to version]'
task :migrate, [:version] do |_t, args|
ARGV.each { |a| task a.to_sym }
RACK_ENV = ARGV[1] if ARGV[1]
require_relative 'app' # DB now set as per RACK_ENV
db_name = URI(settings.database).path[1..-1]
if args[:version]
puts "Migrating '#{db_name}' to version #{args[:version]}"
Sequel::Migrator.run(DB, 'db/migrations', target: args[:version].to_i)
else
puts "Migrating '#{db_name}' to latest"
Sequel::Migrator.run(DB, 'db/migrations')
end
end
end
迁移文件:
...
create_table :grid_patterns do
Integer :row
Integer :col
primary_key [:row, :col], name: :grids_pk
end
create_table :widgets do
primary_key :id
Integer :rows
Integer :cols
foreign_key [:rows, :cols], :grid_patterns, name: 'challenges_grid_fkey'
end
...
我该如何解决这个问题?
您的迁移不需要您的 application/model 代码,它们只需要正确设置 DB
。修改您的应用程序代码,以便您可以需要一个单独的文件来设置 DB
,然后在 运行 迁移时仅加载该文件。