Я пытаюсь использовать Database.Persistant для создания базы данных для приложения Scotty, и я не могу понять синтаксис для добавления ограничения внешнего ключа между таблицами. Например, у меня есть таблица User
и таблица Post
, и я хочу, чтобы таблица Post
имела атрибут authorId
, который ссылается на UserId
в User
. Это можно сделать довольно легко в необработанном SQL, но я хочу иметь доступ к данным через haskell, не прибегая к необработанным командам sql. Кроме того, ограничения будут перезаписываться при миграции базы данных. Это то, что у меня есть на данный момент, чтобы определить базу данных:Внешние ограничения ключа в Yesod/Persistent?
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 author
в блок Post
, он компилируется в порядке, но ничего не происходит; миграция не происходит, и никаких ограничений внешнего ключа не вводится.
Что я делаю неправильно? Любая помощь или рекомендации были бы весьма признательны.
Чтобы быть ясным, я хочу, чтобы атрибут author в Post ссылался на существующее имя пользователя в User.
Спасибо, это имеет смысл. Что касается того, что sqlite не соблюдает ограничения внешнего ключа, это раздражает, но я буду изучать его. Может потребоваться перейти к postgres или mysql. – asg0451
Существует также страница, рассказывающая о внешних ключах в SQLite на GitHub https://github.com/yesodweb/yesod/wiki/Activate-foreign-key-checking-in-Sqlite – zigazou