SORU
6 Mayıs 2010, PERŞEMBE


Multi-tenant bir uygulama'in şemalar PostgreSQL kullanarak oluşturma ve Raylar

Şeyler zaten anladım

Farklı şemalar, etki alanı veya alt etki alanı uygulaması görüntülemek için kullanılan temel veri gören Raylar multi-tenant bir uygulama oluşturmak için nasıl öğreniyorum.

Ben zaten birkaç endişeleri cevap:

  1. Nasıl alt-fu etki ile de çalıştırabilir misin? Here's someone that asked the same question this blog götürür.
  2. Ne veritabanı ve nasıl yapılandırılacaktır?İşte mükemmel bir talk by Guy Naor question about PostgreSQL and schemas iyi.
  3. Zaten benim şemalar aynı yapıya sahip olacak. Tuttukları verileri farklıdır. Yaninasıl tüm şemalar için göçler koşabilir misin?Burada an answer.

Bu üç puan bilmek istiyorum, genel bir sürü kapak. Ancak, bir sonraki adımda şeyleri uygulamanın birçok yolu var gibi. Daha iyi, daha kolay bir yolu vardır diye umuyorum.

Son olarak, soruma

Yeni bir kullanıcı imzaladığında, kolayca şeması oluşturabilirsiniz. Ancakşemalar geri kalanı zaten var olan yapısını yüklemek için en iyi ve en kolay yolu ne olurdu?Burada daha iyi bir fikir verebilir senaryolar/bazı sorular.

  1. Geçmek için edeyimkabuk betiğihalka geçici bir şema ve ithalat terkeder benim ana veritabanı (Adam Naor videosunda ne diyor çok gibi)? İşte quick summary/script I got from the helpful #postgres on freenode. Bu muhtemelen çalışacak olsa da, beni biraz rahatsız ediyor.. aynı zamanda bir sonraki soruyu getiriyor Raylar dışında bir sürü şey yapmak zorundayım.
  2. Bir şekilde bu düz Raylar üzerinde Ruby için var? PostgreSQL bir şema oluşturmak, sadece Raylar veritabanı şeması (şema.sonra yük gibi bu PostgreSQL şemasına rb - biliyorum, kafa karıştırıcı).
  3. Zaten bu eşyalar mücevher/plugin var mı?Yöntemleri "(the_new_schema_name)". create_pg_schema_and_load_rails_schema gibi Eğer orada bir şey yok, muhtemelen iş yapma, ama ben şüpheli hakkında ne kadar iyi test olacak ile tüm hareketli parçaları (özellikle ben sonuna kadar kullanarak bir kabuk komut dosyası oluşturmak ve yönetmek yeni PostgreSQL).

Teşekkürler, çok uzun değildi umarım!

CEVAP
29 EKİM 2010, Cuma


Update Dec 5, 2011

Robertson ve ekibi Brad sayesinde Apartment gem var. Çok kullanışlı ve ağır işleri yapıyor.

Eğer şemalar ile müdahalesi olacak ancak, ben kesinlikle aslında nasıl çalıştığını bilmek öneririm. Jerod Santo's walkthrough Daire gem daha fazla veya daha az ne yaptığını bileceksiniz ile tanışın.

Update 8 GMT 20, 2011 11:23 Aug

Birisi blog post oluşturulan ve bütün bu süreç olsa da oldukça iyi yürüyor.

Güncelleme Mayıs 11, 2010 11:26 GMT 8

Dün geceden beri yeni şema ve yükler bir şema oluşturur bu iş için bir yöntem elde etmek mümkün oldum.içine rb. Ne yaptığımın doğru olduğunu (iyi çalışması için, çok uzak gibi görünür ama bir adım en azından daha yakın olsaydı emin değilim. Eğer daha iyi bir yolu varsa, lütfen bana bildirin.


  module SchemaUtils
   def self.add_schema_to_path(schema)
    conn = ActiveRecord::Base.connection
    conn.execute "SET search_path TO #{schema}, #{conn.schema_search_path}"
   end

   def self.reset_search_path
    conn = ActiveRecord::Base.connection
    conn.execute "SET search_path TO #{conn.schema_search_path}"
   end

   def self.create_and_migrate_schema(schema_name)
    conn = ActiveRecord::Base.connection

    schemas = conn.select_values("select * from pg_namespace where nspname != 'information_schema' AND nspname NOT LIKE 'pg%'")

    if schemas.include?(schema_name)
     tables = conn.tables
     Rails.logger.info "#{schema_name} exists already with these tables #{tables.inspect}"
    else
     Rails.logger.info "About to create #{schema_name}"
     conn.execute "create schema #{schema_name}"
    end

    # Save the old search path so we can set it back at the end of this method
    old_search_path = conn.schema_search_path

    # Tried to set the search path like in the methods above (from Guy Naor)
    # [METHOD 1]: conn.execute "SET search_path TO #{schema_name}"
    # But the connection itself seems to remember the old search path.
    # When Rails executes a schema it first asks if the table it will load in already exists and if :force => true. 
    # If both true, it will drop the table and then load it. 
    # The problem is that in the METHOD 1 way of setting things, ActiveRecord::Base.connection.schema_search_path still returns $user,public.
    # That means that when Rails tries to load the schema, and asks if the tables exist, it searches for these tables in the public schema.
    # See line 655 in Rails 2.3.5 activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
    # That's why I kept running into this error of the table existing when it didn't (in the newly created schema).
    # If used this way [METHOD 2], it works. ActiveRecord::Base.connection.schema_search_path returns the string we pass it.
    conn.schema_search_path = schema_name

    # Directly from databases.rake. 
    # In Rails 2.3.5 databases.rake can be found in railties/lib/tasks/databases.rake
    file = "#{Rails.root}/db/schema.rb"
    if File.exists?(file)
     Rails.logger.info "About to load the schema #{file}"
     load(file)
    else
     abort %{#{file} doesn't exist yet. It's possible that you just ran a migration!}
    end

    Rails.logger.info "About to set search path back to #{old_search_path}."
    conn.schema_search_path = old_search_path
   end
  end

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Khoury

    Adam Khoury

    23 Ocak 2008
  • olinerd

    olinerd

    23 AĞUSTOS 2007
  • VJ VIMANA

    VJ VIMANA

    3 Mayıs 2007