How do I change a string column into a bigint? How do I change a string column into a bigint? heroku heroku

How do I change a string column into a bigint?


Postgres is telling you that there is existing data in that column which it doesn't know how to convert, so it needs an ALTER statement which supplies a USING clause for the column to specify how to cast existing values.

Unfortunately, you're going to need to drop down the database-specific code to accomplish this, or use something similar to the solution suggested here:

http://webjazz.blogspot.co.uk/2010/03/how-to-alter-columns-in-postgresql.html

Edit: Here's how you might do it directly in SQL in your migration:

execute <<-SQL  ALTER TABLE ip_to_countries  ALTER COLUMN ip_number_from TYPE bigint USING ip_number_from::bigintSQL


What is in your ip_number_from column?

In any case, I would probably:

  • create a new column of type bigint,
  • copy the data from ip_number_from to new_column manually through rails console or a rake task,
  • drop the original ip_number_from column
  • rename new_column to ip_number_from

Or you could drop down to SQL, like mjtko suggested, but I'm not sure it will be any easier.

Update

I looked up what Yule is suggesting. I think it would be a bit dangerous to do all of this in one migration, since you can't really check if the casting/copying of data was successful. If you did want to do it in one migration, in your case it would look something like this:

def up  add_column :table, :new_column, :bigint  Model.reset_column_information  Model.all.each do |m|    m.update_attribute :new_column, Model.bigint_from_ip_number_from(m)  end  drop_column :table, :ip_number_from  rename_column :table, :new_column, :ip_number_fromend

You should also then add a corresponding down migration.

You can always split this up in multiple migrations and check the progress/success as you go.


I've recently read - but don't remember where - that you can't cast "string" columns to "int" columns but you can do the contrary. The cast from "int" to "string" is an irreversible migration operation.

I'll search the document where I read that and edit my post when I'll find it.

If you can, the easiest thing to do would be what Jure Triglav is suggesting. (He posted his answer before mine but I was suggesting the same thing ;) ).

[Edit] I found back where I read that: Irreversible Migration tuto.