data/procedure for foreign key

This commit is contained in:
Adam C. Baker
2014-10-08 15:20:26 -07:00
parent 5063dfe894
commit d16ecdc28f
2 changed files with 31 additions and 2 deletions
+20
View File
@@ -36,6 +36,26 @@ instance JSON.ToJSON Table where
toBool :: String -> Bool
toBool = (== "YES")
data ForeignKey = ForeignKey {
fkCol::String, fkTableReferred::String, fkColReferred::String
} deriving (Eq, Show)
foreignKeys :: String -> String -> Connection -> IO [ForeignKey]
foreignKeys schema table conn = do
r <- quickQuery conn
"select kcu.column_name, ccu.table_name AS foreign_table_name,\
\ ccu.column_name AS foreign_column_name \
\from information_schema.table_constraints AS tc \
\ join information_schema.key_column_usage AS kcu \
\ on tc.constraint_name = kcu.constraint_name \
\ join information_schema.constraint_column_usage AS ccu \
\ on ccu.constraint_name = tc.constraint_name \
\where constraint_type = 'FOREIGN KEY' \
\ and tc.table_name=? and tc.table_schema = ? \
\order by kcu.column_name" (map toSql [table, schema])
return [ForeignKey col reftab refcol | [col, reftab, refcol] <-
map (map fromSql) r]
data Column = Column {
colSchema :: String
, colTable :: String
+11 -2
View File
@@ -1,7 +1,8 @@
module Unit.PgStructureSpec where
import Test.Hspec
import PgStructure (Table(..), tables, Column(..), columns)
import PgStructure (Table(..), tables, Column(..), columns, ForeignKey(..),
foreignKeys)
import Database.HDBC (quickQuery)
import SpecHelper(dbWithSchema)
@@ -20,4 +21,12 @@ spec = around dbWithSchema $ beforeWith setRole $ do
map colName cs `shouldBe` ["id","nullable_string","non_nullable_string",
"inserted_at"]
where setRole = \conn -> quickQuery conn "set role dbapi_test" [] >> return conn
describe "foreignKeys" $
it "has a description of the foreign key columns" $ \conn ->
foreignKeys "1" "has_fk" conn `shouldReturn` [
ForeignKey { fkCol="auto_inc_fk",
fkTableReferred="auto_incrementing_pk", fkColReferred="id"},
ForeignKey { fkCol="simple_fk", fkTableReferred="simple_pk",
fkColReferred="k"}
]
where setRole conn = quickQuery conn "set role dbapi_test" [] >> return conn