Packaging (RPM) rails applications

I am in the process of packaging a rails application as an RPM, and I have a few questions regarding the initialization of the database environment.

As part of the post-install script, I need to check to see if the database exists. Depending on the outcome, I may have to run various combinations of db:setup, db:migrate, and/or db:seed. Is there a rake (or some other) task I can run to check for the existence of the "production" database? If not, is there a "standard" way to fetch the database name for the production environment from the database.yml file so I can use external tools?

What I'm thinking about doing is defining the default user, password, and database name as macros/constants in my .spec file. When I build my RPM, I will use sed to generate database.yml with these pre-defined values so they are consistent between my initialization scripts (in the spec file) and the database configuration included in the package. This would work perfectly with a new installation.

The problem with this approach is with upgrading an existing installation. Since database.yml is a configuration file, I have to assume that the database.yml file has been modified and that my "defaults" no longer match the production values. I need a simple way to ask rails "does my production database exist?".

If you’re rails environment variable is set to production (RAILS_ENV=production) then you can run db:create followed by db:migrate. If the db already exists then db:create will do nothing. If the migration is up to date then db:migrate will do nothing.

B.``

Is it better to do db:setup + db:seed or db:migrate for a fresh install? By my understanding, the seed data is not applied during a db:migrate. (This is not an application I have developed, and I am not a Ruby/Rails developer, so please excuse my ignorance!)

Is it better to do db:setup + db:seed or db:migrate for a fresh

install? By my understanding, the seed data is not applied during a

db:migrate. (This is not an application I have developed, and I am

not a Ruby/Rails developer, so please excuse my ignorance!)

Just run rake db:setup. That will create the db, load the schema for it, and then load the data found in the seeds.rb file all in one command. If you want to break it out into steps that you have more control over it would be the following in order:

db:create db:schema:load db:migrate db:seed

B.

Right, but my point was doing db:setup (or db:schema:load) and db:seed is dependent on whether the database exists or not at the time the package is installed. This goes back to my original post -- how do I detect if the database is there if db:create succeeds either way?

If I didn't have seed data, this would be a moot point since I could do db:create + db:migrate every time. Or am I missing something?

Put in other words, this is what I'm trying to do:

if ! database_exists; then     rake db:create     rake db:migrate     rake db:seed else     rake db:migrate fi

It's the "database_exists" logic that I'm trying to get a handle on. I understand (from your last post) that I could do this instead:

rake db:create rake db:migrate

Regardless of whether the database is there or not, but my seed data would not be loaded.

You could write the seed code (db/seeds.rb) so that it works out for itself, based on whether the db is empty or not, or whether some particular data is present, whether to do the seeding. Then you can just run it.

Colin

Right, but my point was doing db:setup (or db:schema:load) and db:seed

is dependent on whether the database exists or not at the time the

package is installed. This goes back to my original post – how do I

detect if the database is there if db:create succeeds either way?

If I didn’t have seed data, this would be a moot point since I could

do db:create + db:migrate every time. Or am I missing something?

You’re missing why I said you can do one or the other. Running db:setup will create the database if it does not exist just like db:create will do. You don’t need to check for the database because those commands do it for you. If those commands find there is not database it will create one for you. You will have a database to seed data into.

Put in other words, this is what I’m trying to do:

if ! database_exists; then

rake db:create

rake db:migrate

rake db:seed

else

rake db:migrate

fi

It’s the “database_exists” logic that I’m trying to get a handle on.

I understand (from your last post) that I could do this instead:

rake db:create

rake db:migrate

Regardless of whether the database is there or not, but my seed data

would not be loaded.

The database will be there. The seed will be run after the database creation if the database does not already exist. Do either this:

db:create db:schema:load db:migrate db:seed

or this:

db:setup

and your work is done. There is no need to check or wrap it with anything else because if the database doesn’t exist it will create it for you.

B.

I may be wrong but I think the OP's problem is that he wishes to *not* run the seed if the database already exists. If so then he can handle that by testing the db in the seed code itself as I suggested in earlier post.

Colin