Merge pull request #21609 from kamipo/do_not_dump_view_as_table
Do not dump a view as a table in sqlite3, mysql and mysql2 adapters
This commit is contained in:
commit
7286677050
@ -1,3 +1,7 @@
|
||||
* Add `#views` and `#view_exists?` methods on connection adapters.
|
||||
|
||||
*Ryuta Kamizono*
|
||||
|
||||
* Correctly dump composite primary key.
|
||||
|
||||
Example:
|
||||
|
@ -36,6 +36,19 @@ def table_exists?(table_name)
|
||||
tables.include?(table_name.to_s)
|
||||
end
|
||||
|
||||
# Returns an array of view names defined in the database.
|
||||
def views
|
||||
raise NotImplementedError, "#views is not implemented"
|
||||
end
|
||||
|
||||
# Checks to see if the view +view_name+ exists on the database.
|
||||
#
|
||||
# view_exists?(:ebooks)
|
||||
#
|
||||
def view_exists?(view_name)
|
||||
views.include?(view_name.to_s)
|
||||
end
|
||||
|
||||
# Returns an array of indexes for the given table.
|
||||
# def indexes(table_name, name = nil) end
|
||||
|
||||
|
@ -550,6 +550,22 @@ def table_exists?(name)
|
||||
tables(nil, schema, table).any?
|
||||
end
|
||||
|
||||
def views # :nodoc:
|
||||
select_values("SHOW FULL TABLES WHERE table_type = 'VIEW'", 'SCHEMA')
|
||||
end
|
||||
|
||||
def view_exists?(view_name) # :nodoc:
|
||||
return false unless view_name.present?
|
||||
|
||||
schema, name = view_name.to_s.split('.', 2)
|
||||
schema, name = @config[:database], schema unless name # A view was provided without a schema
|
||||
|
||||
sql = "SELECT table_name FROM information_schema.tables WHERE table_type = 'VIEW'"
|
||||
sql << " AND table_schema = #{quote(schema)} AND table_name = #{quote(name)}"
|
||||
|
||||
select_values(sql, 'SCHEMA').any?
|
||||
end
|
||||
|
||||
# Returns an array of indexes for the given table.
|
||||
def indexes(table_name, name = nil) #:nodoc:
|
||||
indexes = []
|
||||
|
@ -90,6 +90,30 @@ def table_exists?(name)
|
||||
SQL
|
||||
end
|
||||
|
||||
def views # :nodoc:
|
||||
select_values(<<-SQL, 'SCHEMA')
|
||||
SELECT c.relname
|
||||
FROM pg_class c
|
||||
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
|
||||
WHERE c.relkind IN ('v','m') -- (v)iew, (m)aterialized view
|
||||
AND n.nspname = ANY (current_schemas(false))
|
||||
SQL
|
||||
end
|
||||
|
||||
def view_exists?(view_name) # :nodoc:
|
||||
name = Utils.extract_schema_qualified_name(view_name.to_s)
|
||||
return false unless name.identifier
|
||||
|
||||
select_values(<<-SQL, 'SCHEMA').any?
|
||||
SELECT c.relname
|
||||
FROM pg_class c
|
||||
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
|
||||
WHERE c.relkind IN ('v','m') -- (v)iew, (m)aterialized view
|
||||
AND c.relname = '#{name.identifier}'
|
||||
AND n.nspname = #{name.schema ? "'#{name.schema}'" : 'ANY (current_schemas(false))'}
|
||||
SQL
|
||||
end
|
||||
|
||||
def drop_table(table_name, options = {}) # :nodoc:
|
||||
execute "DROP TABLE#{' IF EXISTS' if options[:if_exists]} #{quote_table_name(table_name)}#{' CASCADE' if options[:force] == :cascade}"
|
||||
end
|
||||
|
@ -324,6 +324,19 @@ def table_exists?(table_name)
|
||||
table_name && tables(nil, table_name).any?
|
||||
end
|
||||
|
||||
def views # :nodoc:
|
||||
select_values("SELECT name FROM sqlite_master WHERE type = 'view' AND name <> 'sqlite_sequence'", 'SCHEMA')
|
||||
end
|
||||
|
||||
def view_exists?(view_name) # :nodoc:
|
||||
return false unless view_name.present?
|
||||
|
||||
sql = "SELECT name FROM sqlite_master WHERE type = 'view' AND name <> 'sqlite_sequence'"
|
||||
sql << " AND name = #{quote(view_name)}"
|
||||
|
||||
select_values(sql, 'SCHEMA').any?
|
||||
end
|
||||
|
||||
# Returns an array of +Column+ objects for the table specified by +table_name+.
|
||||
def columns(table_name) #:nodoc:
|
||||
table_structure(table_name).map do |field|
|
||||
|
@ -89,7 +89,7 @@ def extensions(stream)
|
||||
end
|
||||
|
||||
def tables(stream)
|
||||
sorted_tables = @connection.tables.sort
|
||||
sorted_tables = @connection.tables.sort - @connection.views
|
||||
|
||||
sorted_tables.each do |table_name|
|
||||
table(table_name, stream) unless ignored?(table_name)
|
||||
|
@ -1,7 +1,9 @@
|
||||
require "cases/helper"
|
||||
require "models/book"
|
||||
require "support/schema_dumping_helper"
|
||||
|
||||
module ViewBehavior
|
||||
include SchemaDumpingHelper
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
@ -31,6 +33,15 @@ def test_reading
|
||||
assert_equal ["Ruby for Rails"], books.map(&:name)
|
||||
end
|
||||
|
||||
def test_views
|
||||
assert_equal [Ebook.table_name], @connection.views
|
||||
end
|
||||
|
||||
def test_view_exists
|
||||
view_name = Ebook.table_name
|
||||
assert @connection.view_exists?(view_name), "'#{view_name}' view should exist"
|
||||
end
|
||||
|
||||
def test_table_exists
|
||||
view_name = Ebook.table_name
|
||||
assert @connection.table_exists?(view_name), "'#{view_name}' table should exist"
|
||||
@ -53,6 +64,11 @@ def test_does_not_assume_id_column_as_primary_key
|
||||
end
|
||||
assert_nil model.primary_key
|
||||
end
|
||||
|
||||
def test_does_not_dump_view_as_table
|
||||
schema = dump_table_schema "ebooks"
|
||||
assert_no_match %r{create_table "ebooks"}, schema
|
||||
end
|
||||
end
|
||||
|
||||
if ActiveRecord::Base.connection.supports_views?
|
||||
@ -70,6 +86,7 @@ def drop_view(name)
|
||||
end
|
||||
|
||||
class ViewWithoutPrimaryKeyTest < ActiveRecord::TestCase
|
||||
include SchemaDumpingHelper
|
||||
fixtures :books
|
||||
|
||||
class Paperback < ActiveRecord::Base; end
|
||||
@ -91,6 +108,15 @@ def test_reading
|
||||
assert_equal ["Agile Web Development with Rails"], books.map(&:name)
|
||||
end
|
||||
|
||||
def test_views
|
||||
assert_equal [Paperback.table_name], @connection.views
|
||||
end
|
||||
|
||||
def test_view_exists
|
||||
view_name = Paperback.table_name
|
||||
assert @connection.view_exists?(view_name), "'#{view_name}' view should exist"
|
||||
end
|
||||
|
||||
def test_table_exists
|
||||
view_name = Paperback.table_name
|
||||
assert @connection.table_exists?(view_name), "'#{view_name}' table should exist"
|
||||
@ -109,6 +135,11 @@ def test_attributes
|
||||
def test_does_not_have_a_primary_key
|
||||
assert_nil Paperback.primary_key
|
||||
end
|
||||
|
||||
def test_does_not_dump_view_as_table
|
||||
schema = dump_table_schema "paperbacks"
|
||||
assert_no_match %r{create_table "paperbacks"}, schema
|
||||
end
|
||||
end
|
||||
|
||||
# sqlite dose not support CREATE, INSERT, and DELETE for VIEW
|
||||
|
Loading…
Reference in New Issue
Block a user