data/procedure for foreign key
This commit is contained in:
@@ -36,6 +36,26 @@ instance JSON.ToJSON Table where
|
|||||||
toBool :: String -> Bool
|
toBool :: String -> Bool
|
||||||
toBool = (== "YES")
|
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 {
|
data Column = Column {
|
||||||
colSchema :: String
|
colSchema :: String
|
||||||
, colTable :: String
|
, colTable :: String
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
module Unit.PgStructureSpec where
|
module Unit.PgStructureSpec where
|
||||||
|
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import PgStructure (Table(..), tables, Column(..), columns)
|
import PgStructure (Table(..), tables, Column(..), columns, ForeignKey(..),
|
||||||
|
foreignKeys)
|
||||||
|
|
||||||
import Database.HDBC (quickQuery)
|
import Database.HDBC (quickQuery)
|
||||||
import SpecHelper(dbWithSchema)
|
import SpecHelper(dbWithSchema)
|
||||||
@@ -20,4 +21,12 @@ spec = around dbWithSchema $ beforeWith setRole $ do
|
|||||||
map colName cs `shouldBe` ["id","nullable_string","non_nullable_string",
|
map colName cs `shouldBe` ["id","nullable_string","non_nullable_string",
|
||||||
"inserted_at"]
|
"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
|
||||||
|
|||||||
Reference in New Issue
Block a user