Problem
rake db:migrate is not creating tables in my MySQL database. (Yes, I have read all similar posts, and implemented their suggestions, please continue reading.)
Code
database.yml:
default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: root
password:
host: localhost
port: /tmp/mysql.sock
development:
<<: *default
database: asreport
Line from gemfile (yes, I already gem install'd it too):
gem 'mysql2', '~> 0.3.20'
/appfile/db/migrate/create_users.rb (I've also tried making the second line 'def up'):
class CreateUsers < ActiveRecord::Migration
def up
create_table :users do |t|
t.string :username
t.string :password
t.integer :usertype
t.string :salt
t.timestamps
end
end
end
After I run rake db:drop, rake db:create to refresh, rake db:migrate --trace reads (after this output, 'show tables' in mysql still only shows schema_migrations):
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:migrate
** Invoke db:_dump (first_time)
** Execute db:_dump
** Invoke db:schema:dump (first_time)
** Invoke environment
** Invoke db:load_config
** Execute db:schema:dump
What I've Tried
First of all, I know that I am connecting to MySQL via Ruby, as db:drop create does indeed create the database itself, just not the table.
I've read all the relevant stack overflow posts I could find on the issue. I've tried rollback, dropping my database directly on SQL, and db:drop/create.
I've tried deleting and recreating my migration script too.
I've run db:migrate multiple times (by itself and after db:drop/create's, rollback's, resets), but the schema_migrations always has 0 entries and my schema.rb file is on version: 0.
You're not following the naming conventions outlined in the Rails Guides.
Specifically, this:
2.1
Creating a Standalone Migration Migrations are stored as files in the db/migrate directory, one for each migration class. The name of
the file is of the form YYYYMMDDHHMMSS_create_products.rb, that is to
say a UTC timestamp identifying the migration followed by an
underscore followed by the name of the migration. The name of the
migration class (CamelCased version) should match the latter part of
the file name. For example 20080906120000_create_products.rb should
define class CreateProducts and
20080906120001_add_details_to_products.rb should define
AddDetailsToProducts. Rails uses this timestamp to determine which
migration should be run and in what order, so if you're copying a
migration from another application or generate a file yourself, be
aware of its position in the order.
Go ahead and try a dummy migration to see the file name convention.
$ bin/rails generate migration AddPartNumberToProducts part_number:string
Related
I tried to add check-ins to micro-posts but I've got an error after rake db:migrate.. What does it mean?
Error
$ rake db:migrate --trace
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:migrate
rake aborted!
NoMethodError: undefined method `type' for "character varying":String
add_checkin_to_microposts
class AddCheckinToMicroposts < ActiveRecord::Migration
def change
add_column :microposts, :location, :point, :geographic => true
end
end
database.yml
development:
adapter: postgresql
schema_search_path: public, postgis
encoding: unicode
database: blog_development
host: localhost
pool: 5
username: ********
password:
Assuming you are using the gem activerecord-postgis-adapter, you'd better try to change the database adapter to postgis as recommended in their official document:
https://github.com/rgeo/activerecord-postgis-adapter
the problem that you are having is that point method does not exist in ActiveRecord.
Instantiates a new column for the table. The type parameter is normally one of the migrations native types, which is one of the following: :primary_key, :string, :text, :integer, :float, :decimal, :datetime, :time, :date, :binary, :boolean.
For more info pleas read http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#method-i-column
Hope this helps
I'm trying to run rake db:migrate on a migration I made to drop a few columns and add a few others.
Here is the migration I'm trying to run:
class Demographics < ActiveRecord::Migration
def change
change_table :demographics do |t|
t.remove_column :demographics, :race
t.remove_column :demographics, :other_race
t.integer :race_id
t.integer :other_race_id
t.remove :demographics, :education
t.integer :education_id
t.remove :other_education
t.integer :other_education_id
end
end
end
Here is the output of: rake db:migrate status --trace
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:migrate
** Invoke db:_dump (first_time)
** Execute db:_dump
** Invoke db:schema:dump (first_time)
** Invoke environment
** Invoke db:load_config
** Execute db:schema:dump
rake aborted!
Don't know how to build task 'status'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/task_manager.rb:49:in `[]'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:148:in `invoke_task'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:106:in `block (2 levels) in top_level'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:106:in `each'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:106:in `block in top_level'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:115:in `run_with_threads'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:100:in `top_level'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:78:in `block in run'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:165:in `standard_exception_handling'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:75:in `run'
/var/lib/gems/2.0.0/gems/rake-10.1.1/bin/rake:33:in `<top (required)>'
/usr/local/bin/rake:23:in `load'
/usr/local/bin/rake:23:in `<main>'`enter code here`
You don't need status in the migrate command:
rake db:migrate
should be enough.
You are actually getting an error from rake because of having status in the command:
rake aborted!
Don't know how to build task 'status'
EDIT
Following our discussion I now understand more.
The migration Demographics has already been applied to the database in the past. This is proved by its 14 digit datetime being included in the schema_migrations table.
Migrations are designed to be run once only. They make a change to the database (schema and/or data) and you move on.
When you run rake db:migrate it finds any migration not yet applied to the database (in datetime order from the migration filename), applies it, then puts an entry for the datatime in schema_migrations. Any migration which already has an entry in schema_migrations is ignored.
If you want to make a further change to the database - even to a table created in a previous migration - you should create a new migration, and then use bin rake db:migrate to apply it.
Yes you can backout a previously applied migration - rake db:rollback. Rollbacks will apply in the reverse order the migrations were applied, ie. working backwards from the end of schema_migrations. By default it will only back out the last migration, although you can use the STEP parameter to do more (rake db:rollback STEP=3 for example).
You can also redo a previously applied migraton - rake db:migrate:redo - again with optional STEP parameter. This is really just a shortcut for rollback followed by migrate.
RECOMMENDATION
My recommendation to you would be to put the Demographics migration file back to the way it was before you made the change. This is important in case the migrations need to be all reapplied in the future.
I would now create a new migration to apply the changes to your table:
rails generate migration UseForiegnKeysInDemographics
Make the required alterations; you only need mention the changes to the table:
e.g.
class UseForiegnKeysInDemographics < ActiveRecord::Migration
def change
remove_column :demographics, :race
remove_column :demographics, :other_race
remove_column :demographics, :education
remove_column :demographics, :other_education
add_column :demographics, :race_id, :integer
add_column :demographics, :other_race_id, :integer
add_column :demographics, :education_id, :integer
add_column :demographics, :other_education_id, :integer
end
end
And apply this new migration:
rake db:migrate
I suggest you have a read of the Rails guide on migrations; http://guides.rubyonrails.org/migrations.html as it explains everything better than my brief summary.
Footnote:
As you want to add foreign keys to the demographics table, you might want to consider add_reference instead of add_column. I didn't include this in my example above because I don't know the details of your other tables, but it's well documented in the Rails guide.
I see an issue with your command : rake db:migrate status --trace
You are trying to achieve two things with one command i.e., run the migrations as well as check the status of the migrations with the detailed steps performed.
You can do it in two ways:
1. First Way
To perform the migrations use
rake db:migrate --trace
And then check the status of all your migrations within the application, use
rake db:migrate:status
2. Alternatively
rake db:migrate db:migrate:status --trace
You almost had that but status task is within db:migrate namespace so you need to use db:migrate:status. Here, the first db:migrate will perform the pending migrations whereas db:migrate:status will give the status of all migrations and --trace will give you full backtrace.
I'm following this tutorial,
and I'm having a problem when running rake db:migrate
In db/migrate I have the create_post.rb file:
class CreatePosts < ActiveRecord::Migration
def change
create_table :posts do |t|
t.string :title
t.text :text
t.timestamps
end
end
end
But it does not create the table.
My database.yml file is:
development:
adapter: mysql2
encoding: utf8
database: blog_development
pool: 5
username: root
password:
socket: /tmp/mysql.sock
The output from rake db:migrate seems ok.
I'm using phpMyAdmin to handle the database, which is correctly created manually by me.
What am I doing wrong?
If you are connecting to the right database everything seems fine to me.. I had a similar problem a few weeks ago and the accepted answer of this question fixed my issue.
Here are the steps to run:
rake db:drop:all
rake db:create:all
rake db:migrate
I hope it will fix your problem.
WARNING: this will erase your database.
Could you please tell which OS you got?
Delete the line:
socket: /tmp/mysql.sock
and run:
db:migrate
Give the output of:
db:migrate:status
If this is not working for you, you could also try to add:
host: 127.0.0.1
to your database.yml file
If nothing stated above works please do check your schema.rb for migration contents. If migration contents are already there then just do the below command in production:
rails db:schema:load RAILS_ENV=production.
I'm trying to upgrade an old 1.2.6 Rails application to 2.3.8, and I'm running into a bit of a snag with migrations. Namely, if I have something like ModelName.create(:foo => "bar") in the migration, the migration doesn't complete. It doesn't hit an infinite loop or anything. It just refuses to complete that migration.
Here's some sample code.
This works:
class CreateNewsArticles < ActiveRecord::Migration
def self.up
create_table :news_articles, :force => true do |t|
t.string "name"
t.string "image"
t.text "body"
t.boolean "featured", :default => "0"
t.integer "position"
t.timestamps
end
# Section.create(:name => 'News Articles', :controller => 'news_articles', :description => 'Add, edit, and delete news articles.')
end
def self.down
drop_table :news_articles
Section.find_by_name('News Articles').destroy
end
end
Uncommenting the Section.create(...) means the migration never completes.
Here's the output from rake db:migrate --trace:
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
== CreateNewsArticles: migrating =============================================
-- create_table(:news_articles, {:force=>true})
-> 0.0531s
And after commenting out the Section.create
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
== CreateNewsArticles: migrating =============================================
-- create_table(:news_articles, {:force=>true})
-> 0.0479s
== CreateNewsArticles: migrated (0.0481s) ====================================
** Invoke db:schema:dump (first_time)
** Invoke environment
** Execute db:schema:dump
I've tried this on another computer, and it works. Same version of rake, same version of ruby, and rails is frozen.
rake --VERSION: rake, version 0.8.7, ruby -v: ruby 1.8.6 (2010-02-05 patchlevel 399) [i686-darwin10.3.0], rails -v: Rails 2.3.8
Anyone have any ideas?
You can see the same symptom from a different cause: a migration can hang if you are running:
$ rails console --sandbox
in another process. Quitting the console process allows the migration to complete.
I had same problem .. I found out that there was idle transaction which blocked further queries on this table ..
Run:
heroku pg:ps
To view database processes. You will have to kill idle process:
heroku pg:kill 913 --force -a
(913 is ID of idle process -> change it to your needs
Apparently using ruby 1.8.6-p399 was the culprit. Switching to 1.8.6-p369 solved it.
You might also try defining a bar-bones section model in the migration.
Running rake db:migrate followed by rake test:units yields the following:
rake test:functionals
(in /projects/my_project)
rake aborted!
SQLite3::SQLException: index unique_schema_migrations already exists: CREATE UNIQUE INDEX "unique_schema_migrations" ON "ts_schema_migrations" ("version")
The relevant part of db/schema.rb is as follows:
create_table "ts_schema_migrations", :id => false, :force => true do |t|
t.string "version", :null => false
end
add_index "ts_schema_migrations", ["version"], :name => "unique_schema_migrations", :unique => true
I'm not manually changing this index anywhere, and I'm using Rails' default SQLite3 adapter with a brand new database. (That is, running rm db/*sqlite3 before rake db:migrate doesn't help.)
Is the test:units task perhaps trying to re-load the schema? If so, why? Shouldn't it recognize the schema is already up to date?
In SQLite, index name uniqueness is enforced at the database level. In MySQL, uniqueness is enforced only at the table level. That's why your migrations work in the latter and not the former: you have two indexes with the same name on different tables.
Rename the index, or find and rename the other unique_schema_migrations index, and your migrations should work.
In your database.yml file are your environments setup up to connect to different databases for Development and Test?
IE:
development:
adapter: sqlite3
database: db/dev.sqlite3
timeout: 5000
test:
adapter: sqlite3
database: db/test.sqlite3
timeout: 5000
Try to search if your schema.rb file does not contain other declarations that create an index with the same name: unique_schema_migrations