gpt4 book ai didi

sqlite - Yesod/Persistent 中的外键约束?

转载 作者:行者123 更新时间:2023-12-03 16:51:30 25 4
gpt4 key购买 nike

我正在尝试使用 Database.Persistant 为 Scotty 应用程序创建数据库,但我无法弄清楚在表之间添加外键约束的语法。例如,我有一个 User table 和一个 Post表,我想要 Post表具有属性 authorId其中引用 UserIdUser .这可以在原始 SQL 中很容易地完成,但我希望能够通过 haskell 访问数据,而无需求助于原始 sql 命令。此外,约束将覆盖数据库迁移。这是我目前定义数据库的内容:

share [mkPersist sqlSettings, mkMigrate "migrateAll"]
[persistLowerCase|
User
name String
email String
username String
Primary username
deriving Show
Post
title String
content T.Text
author String
deriving Show
|]

这很好,但没有关键约束,这可能是一件非常糟糕的事情。
如果我尝试添加像 the wiki on github 这样的外键约束说,通过添加行 Foreign User authorfk authorPost块,它编译正常,但没有任何 react ;不会发生迁移,也不会引入外键约束。

我究竟做错了什么?任何帮助或建议将不胜感激。

明确地说,我想要的是 Post 中的 author 属性来引用 User 中的现有用户名。

最佳答案

Persistent使用 Haskell 类型系统生成外键。这就是为什么没有特定的字段类型来指示一个字段引用另一个表中的记录。

您应该使用 Persistent 的 key 类型自动创建以指示 key 。

说我有 UserArticle表。 Persistent将生成 UserIdArticleId为你。然后,您将使用它们来指示引用,如本例所示:

User
username Text
password Text
email Text
description Text Maybe
active Bool

UniqueUser username
UniqueEmail email

deriving Typeable

Article
artname Text
title Text
keywords Text Maybe
description Text Maybe
body Markdown
parent ArticleId Maybe -- optional Foreign Key
user UserId -- required Foreign Key
lastUpdate UTCTime
weight Int
public Bool

UniqueArt artname

deriving Typeable

这个模型说:
  • Article可能持有对另一个 Article 的引用与 parent字段类型 ArticleId Maybe .
  • Article必须持有对 User 的引用与 user字段类型 UserId .

  • 此示例将生成以下 article PostgreSQL 中的表:
                    Table "public.article"
    Column | Type | Modifiers
    -------------+--------------------------+----------------
    id | integer | not null (...)
    artname | character varying | not null
    title | character varying | not null
    body | character varying | not null
    parent | bigint |
    user | bigint | not null
    last_update | timestamp with time zone | not null
    weight | bigint | not null
    public | boolean | not null
    keywords | character varying |
    description | character varying |

    Indexes:
    "article_pkey" PRIMARY KEY, btree (id)
    "unique_art" UNIQUE CONSTRAINT, btree (artname)
    Foreign-key constraints:
    "article_parent_fkey" FOREIGN KEY (parent)
    REFERENCES article(id)
    "article_user_fkey" FOREIGN KEY ("user")
    REFERENCES "user"(id)
    Referenced by:
    TABLE "article" CONSTRAINT "article_parent_fkey"
    FOREIGN KEY (parent)
    REFERENCES article(id)

    注意:如果您使用 SQLite,您必须确保启用外键支持。见→ SQLite Foreign Key Support: Enabling Foreign Key Support

    关于sqlite - Yesod/Persistent 中的外键约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30062707/

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