Permalink
Browse files

When creating database with rake, create schemas in schema_search_pat…

…h if it doesn't exist.
  • Loading branch information...
1 parent 8398f21 commit 6c2a0675f11a9b5b8e88ed7dbccd65cb51be8029 @rizwanreza rizwanreza committed Mar 28, 2010
@@ -651,6 +651,27 @@ def drop_database(name) #:nodoc:
end
end
+ # Creates a schema for the given user
+ #
+ # Example:
+ # create_schema('products', 'postgres')
+ def create_schema(schema_name, pg_username)
+ execute("CREATE SCHEMA \"#{schema_name}\" AUTHORIZATION \"#{pg_username}\"")
+ end
+
+ # Drops a schema
+ #
+ # Example:
+ # drop_schema('products', 'postgres')
+ def drop_schema(schema_name)
+ execute("DROP SCHEMA \"#{schema_name}\"")
+ end
+
+ # Returns an array of all schemas in the database
+ def all_schemas
+ query('SELECT schema_name FROM information_schema.schemata').flatten
+ end
+
# Returns the list of all tables in the schema search path or a specified schema.
def tables(name = nil)
query(<<-SQL, name).map { |row| row[0] }
@@ -85,8 +85,14 @@ namespace :db do
end
when 'postgresql'
@encoding = config[:encoding] || ENV['CHARSET'] || 'utf8'
+ schema_search_path = config['schema_search_path'] || 'public'
+ first_in_schema_search_path = schema_search_path.split(',').first.strip
begin
ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
+ unless ActiveRecord::Base.connection.all_schemas.include?(first_in_schema_search_path)
+ ActiveRecord::Base.connection.create_schema(first_in_schema_search_path, config['username'])
+ $stderr.puts "Schema #{first_in_schema_search_path} has been created."
+ end
ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => @encoding))
ActiveRecord::Base.establish_connection(config)
rescue
@@ -17,6 +17,13 @@ def test_create_database_with_encoding
assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, :encoding => :latin1)
end
+ def test_create_schema
+ assert_equal %(CREATE SCHEMA "rizwan" AUTHORIZATION "postgres"), create_schema(:rizwan, :postgres)
+ end
+
+ def test_drop_schema
+ assert_equal %(DROP SCHEMA "rizwan"), drop_schema(:rizwan)
+ end
private
def method_missing(method_symbol, *arguments)
ActiveRecord::Base.connection.send(method_symbol, *arguments)
@@ -81,6 +81,12 @@ def test_not_specifying_database_name_for_cross_database_selects
def test_encoding
assert_not_nil @connection.encoding
end
+
+ def test_all_schemas
+ @connection.create_schema(:test_schema, :postgres)
+ assert @connection.all_schemas.include?('test_schema')
+ @connection.drop_schema(:test_schema)
+ end
end
def test_table_alias

0 comments on commit 6c2a067

Please sign in to comment.