来自具有持久性 Haskell 的现有数据库的外键
Foreign Key from an existing database with Persistent Haskell
我目前正在使用 Haskell 和 Persistent 开发一个项目,我 运行 在一个小问题上。我想编写一个小库来处理通用的身份验证方法,每个用户都获得 "identity".
此身份使用持久性存储在数据库中。
Identity
lastSeen UTCTime
registration UTCTime
karma Int DEFAULT=0
banned UTCTime Maybe
我的想法是,我的库的用户可以将他们的帐户数据类型映射到身份。我的问题是,当我将类型 IdentityId
赋予我的用户数据类型的字段时,该列是一个整数(没关系)但缺少引用约束。
例如:
User
email Text
identity IdentityId
UniqueIdentity identity
我得到:
Migrating: CREATE TABLE "identity"("id" INTEGER PRIMARY KEY,"last_seen" TIMESTAMP NOT NULL,"registration" TIMESTAMP NOT NULL,"karma" INTEGER NOT NULL,"banned" TIMESTAMP NULL)
Migrating: CREATE TABLE "user"("id" INTEGER PRIMARY KEY,"email" VARCHAR NOT NULL,"identity" INTEGER NOT NULL,CONSTRAINT "unique_identity" UNIQUE ("identity"))
诀窍是:用户的定义是在不同的文件中完成的,我想问题出在这里。
我可以做些什么来强制 persistent 添加引用约束吗?
提前致谢!
我假设您正在使用 SQLite。 SQLite 支持外键约束,但默认情况下,它们没有打开。您必须在迁移前打开它们。
SQLite Foreign Key Support: 2. Enabling Foreign Key Support
这是打开它们的 SQLite 命令:
PRAGMA foreign_keys = ON;
您可以通过 Haskell 打开此 PRAGMA 并使用以下代码持久化:
import qualified Database.Sqlite as Sqlite
import Database.Persist.Sqlite (createSqlPool, wrapConnection)
enableForeignKeys :: Sqlite.Connection -> IO ()
enableForeignKeys conn = Sqlite.prepare conn "PRAGMA foreign_keys = ON;" >>= void . Sqlite.step
createSqliteBackend :: Text -> LogFunc -> IO SqlBackend
createSqliteBackend connStr logFunc = do
conn <- Sqlite.open connStr
enableForeignKeys conn
wrapConnection conn logFunc
createSqliteBackend
将 return 一个 SqlBackend
运行 持续查询并打开 foreign_keys
Pragma。
我目前正在使用 Haskell 和 Persistent 开发一个项目,我 运行 在一个小问题上。我想编写一个小库来处理通用的身份验证方法,每个用户都获得 "identity".
此身份使用持久性存储在数据库中。
Identity
lastSeen UTCTime
registration UTCTime
karma Int DEFAULT=0
banned UTCTime Maybe
我的想法是,我的库的用户可以将他们的帐户数据类型映射到身份。我的问题是,当我将类型 IdentityId
赋予我的用户数据类型的字段时,该列是一个整数(没关系)但缺少引用约束。
例如:
User
email Text
identity IdentityId
UniqueIdentity identity
我得到:
Migrating: CREATE TABLE "identity"("id" INTEGER PRIMARY KEY,"last_seen" TIMESTAMP NOT NULL,"registration" TIMESTAMP NOT NULL,"karma" INTEGER NOT NULL,"banned" TIMESTAMP NULL)
Migrating: CREATE TABLE "user"("id" INTEGER PRIMARY KEY,"email" VARCHAR NOT NULL,"identity" INTEGER NOT NULL,CONSTRAINT "unique_identity" UNIQUE ("identity"))
诀窍是:用户的定义是在不同的文件中完成的,我想问题出在这里。
我可以做些什么来强制 persistent 添加引用约束吗?
提前致谢!
我假设您正在使用 SQLite。 SQLite 支持外键约束,但默认情况下,它们没有打开。您必须在迁移前打开它们。
SQLite Foreign Key Support: 2. Enabling Foreign Key Support
这是打开它们的 SQLite 命令:
PRAGMA foreign_keys = ON;
您可以通过 Haskell 打开此 PRAGMA 并使用以下代码持久化:
import qualified Database.Sqlite as Sqlite
import Database.Persist.Sqlite (createSqlPool, wrapConnection)
enableForeignKeys :: Sqlite.Connection -> IO ()
enableForeignKeys conn = Sqlite.prepare conn "PRAGMA foreign_keys = ON;" >>= void . Sqlite.step
createSqliteBackend :: Text -> LogFunc -> IO SqlBackend
createSqliteBackend connStr logFunc = do
conn <- Sqlite.open connStr
enableForeignKeys conn
wrapConnection conn logFunc
createSqliteBackend
将 return 一个 SqlBackend
运行 持续查询并打开 foreign_keys
Pragma。