mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
mode postgresql adapters table_exists? method take the schema in to account. [#4341 state:resolved]
Signed-off-by: wycats <wycats@gmail.com>
This commit is contained in:
parent
803df08d89
commit
ecf039fc05
2 changed files with 38 additions and 1 deletions
|
@ -670,8 +670,30 @@ module ActiveRecord
|
|||
def tables(name = nil)
|
||||
query(<<-SQL, name).map { |row| row[0] }
|
||||
SELECT tablename
|
||||
FROM pg_tables
|
||||
WHERE schemaname = ANY (current_schemas(false))
|
||||
SQL
|
||||
end
|
||||
|
||||
def table_exists?(name)
|
||||
name = name.to_s
|
||||
schema, table = name.split('.', 2)
|
||||
|
||||
unless table # A table was provided without a schema
|
||||
table = schema
|
||||
schema = nil
|
||||
end
|
||||
|
||||
if name =~ /^"/ # Handle quoted table names
|
||||
table = name
|
||||
schema = nil
|
||||
end
|
||||
|
||||
query(<<-SQL).first[0].to_i > 0
|
||||
SELECT COUNT(*)
|
||||
FROM pg_tables
|
||||
WHERE schemaname = ANY (current_schemas(false))
|
||||
WHERE tablename = '#{table.gsub(/(^"|"$)/,'')}'
|
||||
#{schema ? "AND schemaname = '#{schema}'" : ''}
|
||||
SQL
|
||||
end
|
||||
|
||||
|
|
|
@ -52,6 +52,21 @@ class SchemaTest < ActiveRecord::TestCase
|
|||
@connection.execute "DROP SCHEMA #{SCHEMA_NAME} CASCADE"
|
||||
end
|
||||
|
||||
def test_table_exists?
|
||||
[Thing1, Thing2, Thing3, Thing4].each do |klass|
|
||||
name = klass.table_name
|
||||
assert @connection.table_exists?(name), "'#{name}' table should exist"
|
||||
end
|
||||
end
|
||||
|
||||
def test_table_exists_wrong_schema
|
||||
assert(!@connection.table_exists?("foo.things"), "table should not exist")
|
||||
end
|
||||
|
||||
def test_table_exists_quoted_table
|
||||
assert(@connection.table_exists?('"things.table"'), "table should exist")
|
||||
end
|
||||
|
||||
def test_with_schema_prefixed_table_name
|
||||
assert_nothing_raised do
|
||||
assert_equal COLUMNS, columns("#{SCHEMA_NAME}.#{TABLE_NAME}")
|
||||
|
|
Loading…
Reference in a new issue