gpt4 book ai didi

postgresql - 如何根据 Haskell Groundhog 的数据库类型指定不同的列类型?

转载 作者:行者123 更新时间:2023-11-29 11:36:56 25 4
gpt4 key购买 nike

使用 Haskell 中的 Groundhog 库,我希望实现一个列类型,当后端是 Postgresql 时使用“uuid”,否则只需对任何其他后端使用“varchar”。虽然根据 Groundhog.Core 中的评论,这应该是可能的,但我不完全确定如何从 proxy db 解包 dbType,并且在 groundhog-examples 中没有这样的示例,因为这些示例中的列类型已被硬编码。

我需要帮助的地方是 Postgresql 的大小写匹配,我会在排序后解决剩下的问题。这是我所在的位置:

instance PrimitivePersistField UUID where
toPrimitivePersistValue _ uuid = PersistString $ show uuid
fromPrimitivePersistValue _ (PersistString a) = fromJust $ UUIDmethods.fromString a

instance PersistField UUID where
persistName _ = "UUID"
toPersistValues = primToPersistValue
fromPersistValues = primFromPersistValue
dbType db _ = case db of
Postgresql _ -> DbTypePrimitive (DbOther $ OtherTypeDef [Left "uuid"]) False Nothing Nothing
_ -> DbTypePrimitive (DbOther $ OtherTypeDef [Left "varchar"]) False Nothing Nothing

编译时出现:

   Couldn't match expected type ‘proxy db’
with actual type ‘Postgresql’
Relevant bindings include
db :: proxy db (bound at basicGroundhog.hs:34:10)
dbType :: proxy db -> UUID -> DbType
(bound at basicGroundhag.hs:34:3)
In the pattern: Postgresql _
In a case alternative:
Postgresql _
-> DbTypePrimitive
(DbOther $ OtherTypeDef [Left "uuid"]) False Nothing Nothing
In the expression:
case db of {
Postgresql _
-> DbTypePrimitive
(DbOther $ OtherTypeDef [Left "uuid"]) False Nothing Nothing
_ -> DbTypePrimitive
(DbOther $ OtherTypeDef [Left "varchar"]) False Nothing Nothing }

最佳答案

您可以使用 backendName 在运行时检查数据库。 default case最好放DbString,这样groundhog就可以选择更合适的类型。没有最大长度声明的 Varchar 在 MySQL 中是无效的。

dbType db _ = case backendName db of
"postgresql" -> DbTypePrimitive (DbOther $ OtherTypeDef [Left "uuid"]) False Nothing Nothing
_ -> DbTypePrimitive DbString False Nothing Nothing

关于postgresql - 如何根据 Haskell Groundhog 的数据库类型指定不同的列类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27349483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com