Упорный `upsert` не работает - PullRequest
0 голосов
/ 26 апреля 2018

Я, видимо, запутался в функции Persistent upsert и в том, как она работает с Postgres 9.5.

Я пишу приложение Yesod, которое принимает значение JSON, анализирует его, а затем выполняет upsert в соответствующей таблице базы данных. Я проверил, что JSON анализируется в правильное значение. Смотрите код:

postITSClientsR :: Handler TypedContent
postITSClientsR = do
  i <- requireJsonBody :: Handler IntensiveTreatmentClient
  row <- runDB $ upsert i []
  selectRep . provideJson $ row

Я также проверил, что этот тип модели имеет ограничение уникальности:

IntensiveTreatmentClient json
  clientId ClientId
  UniqueIntensiveTreatmentClientClientId clientId
  etc...

Однако мое новое значение не сохраняется. Я проверял это несколько раз, но журнал Yesod, вероятно, является наиболее показательным, поскольку он сообщает:

POST /api/itsClients
  Params: [("{\"clientId\":1,...","")]
  Request Body: {"clientId":1,...}
  Accept: */*
  Status: 200 OK 0.005041s

(Поля были преднамеренно удалены для анонимизации) Как правило, журнал будет сообщать о выполненном SQL-запросе, а не о каких-либо.

Что происходит? Yesod или Persistent просто молча отбрасывают мой запрос без ошибок.

1 Ответ

0 голосов
/ 30 июня 2018

Я думаю, что комментарий upsert - ошибка. Я открыл запрос извлечения и добавил: PersistentTest: сбой загрузки, ожидался эквивалентный повторный запрос по ncaq · Запрос извлечения # 821 · yesodweb / persistent

upsert не обновлять, когда список с двумя аргументами пуст.

Если вы хотите уникальный репорт. Этот код, созданный мной, вы можете использовать с лицензией cc переполнения стека.

-- | if a record exist by unique, then 'replace', else 'insert'
repsertBy :: ( PersistEntityBackend record ~ BaseBackend backend
             , PersistStoreWrite backend
             , PersistEntity record
             , PersistUniqueRead backend
             , MonadIO m) =>
             record -> ReaderT backend m (Key record)
repsertBy record = do
    me <- getByValue record
    case me of
        Nothing             -> insert record
        Just (Entity key _) -> replace key record >> return key

Но этот код был отклонен в мейнстриме Yesod. Потому что, когда существует несколько уникальных констант, тогда они не определены.

...