rake db:schema:load insists on querying my database for data I haven't loaded.

Rails 2.3.2. Ruby 1.8.7. MySQL 5.x

I have used "rake db:schema:dump" to generate a migration structure to go from development to production. I want to use "rake db:schema:load" to load it into my new database. Sounds like a plan.

When I run "rake db:schema:load" on the new database (development or production), I get the following error:

<from development test> rake aborted! Mysql::Error: Table 'mojo_development.statuses' doesn't exist: SELECT * FROM `statuses` WHERE (`statuses`.`name` = 'New') LIMIT 1

(production gives the same, but database name is mojo_production).

The Select is not in the schema. If I trace it back, I find the Select is generated from the following method in my Mojo model:

  def self.new_state     for_name('New').first   end

where for_name is a :named_scope generating the select statement above.

So my questions are:

1) WHY does db:schema:load run queries against my database when the data (and tables) aren't there?

and

2) HOW do I fix this so it won't happen again?

Posting the results of running the rake command with --trace always helps, but I'd say the likely culprit here is something in your environment / initializers. Does that function get called from environment.rb or an initializer?

--Matt Jones

Eric Smith wrote:

Rails 2.3.2. Ruby 1.8.7. MySQL 5.x

I have used "rake db:schema:dump" to generate a migration structure to go from development to production. I want to use "rake db:schema:load" to load it into my new database. Sounds like a plan.

When I run "rake db:schema:load" on the new database (development or production), I get the following error:

Your rake task is picking up your development environment from config/environment.rb.

Here's what you can do to start off with a clean production schema provided you are the only one working on your db and you have foolishly/wisely modified your db schema without going through a proper migration strategy..

1) perform a rake db:schema:dump 2) remove all prior migration files 3) perform a rake db:migrate 4) open the migration file just created, and cut and paste the contents from the schema.rb file that you created in step 1. (during the paste, just copy the relevant parts, avoid the database create part..) 5) Now you can use that migration file on production 6) Ask that girl in finance out on a date like you promised yourself 2 weeks ago.

hth

ilan

rake db:schema:load requires the environment task (which loads your app config and so on) in production config.cache_classes is true, which means that your applications models are loaded your Mojo model is loaded, and reaches the line

named_scope :some_scope, :conditions => {.... self.new_state }

which runs your new_state ,method, which queries the database

One possible solution: alter your environment so that cache classes doesn't get set to true in cases like this. I outlined a few ways of doing this at When cache_classes gets you down - Space Vatican

Fred