Używam trwałych do zapisania następujących rekordów (czas to UTCTime).yesod persistent postgresql complex record
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
|]
Kiedy migrować struktury ja dostać stolik rezerwacji:
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)
)
i poziom tabeli:
CREATE TABLE level
(
id serial NOT NULL,
"limit" double precision NOT NULL,
volumes character varying NOT NULL,
CONSTRAINT level_pkey PRIMARY KEY (id)
)
Wkładając książkę, tabela poziom pozostaje pusty i książka tabela zawiera wpis zawierający wersje JSON planowanego rekordu.
Pytania:
Jak mogę uzyskać trwałe w użyciu rzeczywistych typów prostych (np int i czas) dla kolumn zamiast JSON dla złożonych typów?
Czy w sposób trwały umie się przechowywać relacje wiele do wielu?
np. dali Rekord A z listy :: [B], mogę je stworzyć trzecią tabelę z
AId | B
-------
1 | b1
1 | b2 etc
Używam następujące pakiety:
persistent-postgresql-1.0.3
yesod-persistent-1.1.0.1
Postgres 9.1
Funkcja Persistent nie podejmuje prób zarządzania relacjami, dlatego należy ręcznie zdefiniować tabele odnośników. Określ typy list, takie jak '[Poziom]' powoduje, że cała lista jest serializowana do jednego pola, jak zaobserwowałeś. Możesz używać identyfikatorów takich jak 'BookId' i' LevelId', aby odnieść się do zapisów innych tabel. –