【发布时间】:2013-10-12 10:09:46
【问题描述】:
我正在使用持久化保存以下记录(时间为 UTCTime)。
type Price = Int
type Volume = Int
share [mkPersist sqlSettings, mkMigrate "migrateBook"]
[persistLowerCase|
Level
limit Price
volumes [Volume]
deriving Show Read Eq
Book
time Time
asks [Level]
bids [Level]
deriving Show Read Eq
|]
当我迁移结构时,我得到一个 Book 表:
CREATE TABLE book
(
id serial NOT NULL,
"time" timestamp without time zone NOT NULL,
asks character varying NOT NULL,
bids character varying NOT NULL,
CONSTRAINT book_pkey PRIMARY KEY (id )
)
还有一个表级别:
CREATE TABLE level
(
id serial NOT NULL,
"limit" double precision NOT NULL,
volumes character varying NOT NULL,
CONSTRAINT level_pkey PRIMARY KEY (id )
)
插入书籍时,级别表保持为空,并且书籍表包含包含预期记录的 JSON 版本的条目。
问题:
我怎样才能持久地为列使用实际的简单类型(例如 int 和 time)而不是复杂类型的 JSON?
Persistent 知道如何存储多对多关系吗?
例如给定一个带有列表 :: [B] 的记录 A,我可以用它创建第三个表吗
AId | B
-------
1 | b1
1 | b2 etc
我正在使用以下软件包:
persistent-postgresql-1.0.3
yesod-persistent-1.1.0.1
Postgres 9.1
【问题讨论】:
-
Persistent 不会尝试管理关系,因此您需要手动定义查找表。如您所见,指定
[Level]等列表类型会导致整个列表序列化为单个字段。您可以使用BookId和LevelId等标识符来引用其他表的记录。
标签: database haskell orm yesod persistent