Migrate postgresql database to uuid

211 views
Skip to first unread message

kingston jenorish.s

unread,
Oct 25, 2013, 9:17:55 AM10/25/13
to bangal...@googlegroups.com, rubyonra...@googlegroups.com, chen...@googlegroups.com
Hi all,

I am using rails 3.1 and ruby 1.9.3,Now i want to use uuid concept in
rails 3 for existing data

so i did like :-

create_table :posts, :id => false do |t|
t.string :uuid, :limit => 36, :primary => true
end

ActiveRecord::Base.class_eval do

# old rails versions
set_primary_key 'uuid'

before_create :generate_uuid
def generate_uuid
self.id = UUIDTools::UUID.random_create.to_s
end
end


This is working for new data,now i want to migrate existing data with
relation.for uuid they are using datatype as string,in postgresql the
data type used for primary_key and foreign key is integer ,so if i am
trying to change foreign key integer to string it is throwing error.

Could you please tell me some example,how to do this.

kingston.s

Carlos Figueiredo

unread,
Oct 25, 2013, 9:43:35 AM10/25/13
to rubyonra...@googlegroups.com, bangal...@googlegroups.com, chen...@googlegroups.com
By default, a table on PostgreSQL does not register UUID...
It might work only for new tables you create, because to Postgres use UUID you need say it when creating the table... for existing ones, it might not happen because the table on PostgreSQL may not have been created with the option to use Uuids.



Atenciosamente,

Carlos Figueiredo



kingston.s

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
To post to this group, send email to rubyonra...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/CAC2JRvHk-%3D8MmUmny_ovKKVbEQD6%3D%2By3Bc5-MDssvcBNUYxCrA%40mail.gmail.com.
For more options, visit https://groups.google.com/groups/opt_out.

Kashif Umair Liaqat

unread,
Oct 27, 2013, 12:27:57 AM10/27/13
to rubyonra...@googlegroups.com, bangal...@googlegroups.com, chen...@googlegroups.com

You might need to write a migration or rake task for this purpose.

Migration may look like this.

class MigrateData < ActiveRecord::Migration
  def change
    get_all_models.each do |model|
      model.where('').find_each do |model_instance|
        model_instance.update_attributes id: UUIDTools::UUID.random_create.to_s
      end
    end
  end

  def get_all_models
    Module.constants.select do |constant_name|
      constant = eval constant_name
      if not constant.nil? and constant.is_a? Class and constant.superclass == ActiveRecord::Base
        constant
      end
    end
  end
end
This migration will iterate over all the models in your app and generate UUID for each single instance.

kingston.s

unread,
Oct 28, 2013, 12:36:41 AM10/28/13
to rubyonra...@googlegroups.com, bangal...@googlegroups.com, chen...@googlegroups.com
For single instance migration we could do like this,what to be done if i want to migrate single instance with the relation?

Kashif Umair Liaqat

unread,
Oct 28, 2013, 1:29:04 AM10/28/13
to rubyonra...@googlegroups.com, bangal...@googlegroups.com, chen...@googlegroups.com
I could not understand that what do you mean by single instance migration with relation. Can you please elaborate more?

kingston.s

unread,
Oct 28, 2013, 1:58:18 AM10/28/13
to rubyonra...@googlegroups.com, bangal...@googlegroups.com, chen...@googlegroups.com
 I  have model called user.
 
user.rb
 
class User < ActiveRecord::Base
 
  has_many :sites,:through=>:site_user_roles
  belongs_to :country
  has_many :payments
  has_and_belongs_to_many :events
 
end
 
like above i am having lots of association,now i want to migrate all the relation to uuid.

Kashif Umair Liaqat

unread,
Oct 29, 2013, 2:07:22 AM10/29/13
to rubyonra...@googlegroups.com, bangal...@googlegroups.com, chen...@googlegroups.com
By looking at your code, I assume that you have these models in your application. SiteCountry,PaymentSiteUserRole and Event. If that's true then you don't have to worry about that. The migration, that I shared before, will iterate through all these models and ID in every database table will be replaced with generated UUID.
Reply all
Reply to author
Forward
0 new messages