PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tạo một ứng dụng nhiều người thuê bằng các lược đồ và Rails của PostgreSQL

Cập nhật ngày 5 tháng 12 năm 2011

Cảm ơn Brad Robertson và nhóm của anh ấy, đã có viên ngọc căn hộ . Nó rất hữu ích và thực hiện rất nhiều công việc nặng nhọc.

Tuy nhiên, nếu bạn đang mày mò với các lược đồ, tôi thực sự khuyên bạn nên biết nó thực sự hoạt động như thế nào. Tự làm quen với hướng dẫn của Jerod Santo , vì vậy bạn sẽ biết những gì viên ngọc Căn hộ đang làm ít nhiều.

Cập nhật 11:23 GMT + 8 ngày 20 tháng 8 năm 2011

Ai đó đã tạo bài đăng trên blog và đi qua toàn bộ quá trình này khá tốt.

Cập nhật ngày 11 tháng 5 năm 2010 11:26 GMT + 8

Kể từ đêm qua, tôi đã có thể nhận được một phương thức hoạt động để tạo ra một lược đồ mới và tải schema.rb vào đó. Không chắc liệu những gì tôi đang làm có đúng hay không (dường như hoạt động tốt, cho đến nay) nhưng ít nhất nó đã tiến gần hơn một bước. Nếu có cách nào tốt hơn, vui lòng cho tôi biết.


  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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chia sẻ bảng giữa nhiều cơ sở dữ liệu Postgresql

  2. Lỗi khi cố gắng kết nối R với PostgreSQL bằng RODBC

  3. Cho thuê nhiều lần với SQLAlchemy

  4. câu hỏi về các biến liên kết postgresql

  5. Thao tác CRUD chung Slick 2.0