Heroku db:migrate adding migrations before table - ruby-on-rails

I made a rails 4 app with the default sqllite. But on heroku when I run my first migration I get errors, meanwhile everything works flawlessly locally:
$ heroku run rake db:migrate
Error:
Running `rake db:migrate` attached to terminal... up, run.3709
Migrating to AddIndexToUserName (20131003064019)
== AddIndexToUserName: migrating =============================================
-- add_index(:users, :name, {:unique=>true})
PG::UndefinedColumn: ERROR: column "name" does not exist
: CREATE UNIQUE INDEX "index_users_on_name" ON "users" ("name")
rake aborted!
An error has occurred, this and all later migrations canceled:
PG::UndefinedColumn: ERROR: column "name" does not exist
: CREATE UNIQUE INDEX "index_users_on_name" ON "users" ("name")/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in `exec'
/
This is my database.yml
development:
adapter: postgresql
encoding: unicode
database: poets_app_development
pool: 5
username: alain
password: some_password

So, if I were to debug this I would do two things.
Use the same DB in development as you would in production(best practice and will save time in the long run).
Try dropping the DB and re-running the migration locally. I suspect that this will fail as well.
rake db:reset
rake db:migrate
It seems like your migrations might be out of order or referencing something that is not yet in the database. This should throw an error locally as well.

Related

Rails tutorial, chapter 6 - SQLite3::SQLException: table "users" already exists

First I ran: rails generate model User name:string email:string and this create a migration. Later I did a db:migrate and I get this error:
bundle exec rake db:migrate
== 20150728195629 CreateUsers: migrating ======================================
-- create_table(:users)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: table "users" already exists.....
When you generate model the table user is created but then when you rake db:migrate it tries to create it again.
I'm confused! Am I doing something wrong?
https://www.railstutorial.org/book/modeling_users#code-generate_user_model
just run into the console
rails console
and type in
ActiveRecord::Migration.drop_table(:users)
and then
exit the console and
rake db:migrate
You must have created a table as Marsatomic said. Run
bundle exec rake db:migrate:status
And look at your migration history to see where you created it. If you see it, you can roll back your migrations past that table, delete the migration file that created it, and then re-run your migrations. If you don't see it anywhere, you must have created the table without a migration. At that point you should do as Marsatomic instructed in his comment above.
you can use 'db:reset', it == 'db:drop db:create db:migrate'
just run into the console
rails db:reset
just run into the console
bundle exec rails db:migrate

Error with heroku run rake db:migrate

I am trying to run the command on Heroku
Heroku run rake db:migrate
but I get the error:
Migrating to AddNameToUsers (20130320002032)
== AddNameToUsers: migrating =================================================
-- add_column(:users, :name, :string)
rake aborted!
An error has occurred, this and all later migrations canceled:
PG::Error: ERROR: relation "users" does not exist
: ALTER TABLE "users" ADD COLUMN "name" character varying(255)
This might have to do with the fact that I had some issues with the migration files on my local server. I managed to work around it and had to delete one of the files, but I worry that I might have deleted something I need that hadn't been migrated to heroku's database?
my github for the account is https://github.com/jeremybelcher/omrails
Any help is appreciated
Your previous migrations are missing.
You can do:
rake db:create
rake db:schema:load
rake db:migrate
Which will recreate your database based on your schema.rb file.

Editing migrations after deployment to production

I'm finishing a major refactoring of an app and I am trying to clean up the migrations. I've made the changes and everything works great locally after reseting and re-migrating the database.
On production I can't get the migrations to run. I've tried every combination of reset, drop, etc. that I can think of but I keep getting this error.
It seems like the production database isn't being reset which is causing the migration to break. Any tips would be appreciated.
== AddFieldsToUsers: migrating ===============================================
-- add_column(:users, :company, :string)
rake aborted!
An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: duplicate column name: company: ALTER TABLE "users" ADD "company" varchar(255)
For resetting the database you can drop and migrate the database again in production mode.
rake db:drop db:create db:migrate RAILS_ENV=production
And, if you want to edit some particular migration, you can reset it using its version no.
rake db:migrate:down VERSION=<version no.> RAILS_ENV=production
Edit the migration file, and then
rake db:migrate:up VERSION=<version no.> RAILS_ENV=production

Need help migrating database from development to test using Rails

Similar questions has been asked a lot. But, I think my situation is a bit different. I pulled a db from Heroku (I use sqlite3 in prod) to my local machine (uses PostgreSQL ). The prod db didn't have any data at that time.
After that time I haven't done any db migrations to test. Now I have a couple of fields in my dev db. However, when I go to test console to see what I have (referring a User table) User.count returns 0, but returns 2 users in dev.
So I did rake db:migrate RAILS_ENV=test there was neither an error message nor a success message. I thought it was success and checked the test db if it has those 2 users and still nothing. Then I tried bundle exec rake db:test:prepare. This was the output
**You have 4 pending migrations:
20120415210441 CreateUsers
20120418064930 AddIndexToUsersEmail
20120419034627 AddPasswordDigestToUsers
20120504031144 AddRememberTokenToUsers
Run `rake db:migrate` to update your database then try again.**
What is the solution?
EDIT:
FYI: I am using windows
I also run rake db:migrate and I got this error.
$ rake db:migrate
== CreateUsers: migrating ====================================================
-- create_table(:users)
rake aborted!
An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: table "users" already exists: CREATE TABLE "users" ("id"
INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "email" varcha
(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL)
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
The error message indicates that your dev and test migrations are out of sync.
First run migrate on dev. This will update dev with all your recent migrations.
rake db:migrate
Then run db:test:prepare. This will make the test database the same schema as dev.
rake db:test:prepare
Now, understand that db:test:prepare makes test have the same schema as dev, but with no records. To populate records in test, implement fixtures or factories (see the factory-girl gem). Factories are generally called in your test to create records for that test.
That's another question and another answer.
You should drop the table and re-run the migrations.
If you don't know how to drop a table in SQLite, then
comment out the create_table method call in the 20120415210441_CreateUsers.rb.
Run > rake db:migrate VERSION=20120415210441
Run > rake db:migrate VERSION=??? where ??? is the version of the migration prior to CreateUsers.
Uncomment the code in 20120415210441_CreateUsers.rb
Run > rake db:migrate

Can't run DB migration on PostgreSQL

I've just changed from sqlite3 to PG and after creating a database via pgAdmin and trying to run a migration, I run into the following, which I don't understand.
Pawel:bodb pawel$ rake db:create
DEPRECATION WARNING: Rake tasks in /Users/pawel/Ruby/apps/bodb/vendor/plugins/google_charts_on_rails/tasks/google_charts_on_rails_tasks.rake are deprecated. Use lib/tasks instead. (called from /Users/pawel/Ruby/apps/bodb/Rakefile:7)
firstdb already exists
Pawel:bodb pawel$ rake db:migrate
DEPRECATION WARNING: Rake tasks in /Users/pawel/Ruby/apps/bodb/vendor/plugins/google_charts_on_rails/tasks/google_charts_on_rails_tasks.rake are deprecated. Use lib/tasks instead. (called from /Users/pawel/Ruby/apps/bodb/Rakefile:7)
== AddLikesToUsers: migrating ================================================
-- add_column(:Users, :likes, :string)
rake aborted!
An error has occurred, this and all later migrations canceled:
PGError: ERROR: relation "Users" does not exist
: ALTER TABLE "Users" ADD COLUMN "likes" character varying(255)
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
I don't know about the warnings, but the error message says:
relation "Users" does not exist
Maybe you are using upper case "Users", where the table's name is users? Identifiers in PostgreSQL are case insensitive as long as they are not double-quoted.
It appear that the migration assumes that an Users table already exists which is not the case with a completely new PostgreSQL database...
Did you forget to add some start schema to the database?

Resources