2008-09-19 2 views
34

Каков наилучший способ взаимодействия с базой данных с помощью Haskell? Я привык использовать какой-то ORM (ORM Django, hibernate и т. Д.), И что-то подобное было бы неплохо при создании приложений с HAppS.Есть ли инструменты ORM для Haskell?

Редактировать: Я хотел бы быть свободным выбирать из Postgresql MySql и SQLite до фактических баз данных.

ответ

13

Библиотека, которую я имею в виду, не является ORM, но она все равно может делать то, что вы хотите.

Если вы хотите что-то, что сделает вашу базу данных доступной безопасно, при этом интегрируя вещи в вашу программу, попробуйте HaskellDB. Он в основном рассматривает вашу схему, генерирует некоторые структуры данных, а затем дает вам тип безопасных способов запроса. Это было довольно давно, и мнение сообщества заключается в том, что оно хорошее и стабильное.

Чтобы использовать его, вам понадобится базовая библиотека Haskell DB, такая как HSQL.

Удачи вам!

+0

Документ HaskellDB: www.cs.chalmers.se/~bringert/publ/haskelldb/haskelldb-db-2005.pdf – rcreswick 2008-09-19 22:57:42

+1

У HaskellDB есть проблема, что в настоящее время он не работает с последними версиями GHC (6.8 или 6.10). – 2008-11-11 23:29:10

1

Вы смотрели через отображение базы данных и доступа к пакетам на http://hackage.haskell.org/packages/archive/pkg-list.html#cat:Database

Я не использовал их, поэтому не могу рекомендовать какой-либо конкретной один. Я также не знаю, какие базы данных вы планируете использовать.

+0

Обновлен вопрос в список баз данных, в котором я заинтересован, но это не должно быть значительным критерием фильтрации. В прошлом я немного исказил хак, но, вероятно, мне следовало бы ползать снова. Однако я хотел бы услышать от людей с личным опытом. – rcreswick 2008-09-19 22:01:15

2

Я на самом деле очень похож на подход HAppS (HAppS-State), который позволяет забыть о том, как пройти через маршаллинг/unmarshalling cludge ORM, и давайте просто использовать типы данных Haskell.

13

Причина, по которой существуют библиотеки ORM, заключается в том, что между объектами на C# или Java существует относительно большая разница и то, что вы храните в базе данных. Это не столько вопрос в Haskell, потому что:

  1. Он не имеет объектов
  2. Обе базы данных и список Haskell имеют свое вдохновение в математической теории множеств, поэтому трение между ними намного меньше, чем между базами данных и объекты.
2

Я лично использовал только Database.HDBC, который рекомендован «Real World Haskell»: http://book.realworldhaskell.org/read/using-databases.html

Но я согласен, что это, безусловно, имеет смысл использовать уровень доступа к БД более высокого уровня, и я, вероятно, попытайтесь перейти к такой модели для будущих проектов. По этой теме, я нашел этот пост с 2012 года, который обеспечивает историю и сравнение таких решений для Haskell: http://www.yesodweb.com/blog/2012/03/history-of-persistence

Из него, я понял, что Persistent (documentation) и сурок (some documentation, examples) являются наиболее перспективными библиотеками в этой области. Обе библиотеки поддерживают упомянутые вами базы данных; для Сурка это не написано в этом посте, но in this announcement вы можете увидеть, что она поддерживает именно ДЕЦИБЕЛЫ вы заинтересованы.

отметить также this thread on Haskell-beginners, в котором Esqueletto упоминается как лучший выбор для операций обновления.

Обратите внимание, что постоянные корабли с Йесодом и как таковые могут иметь большее значение.

8

Стойкий является довольно приятным в использовании и позволяет полагаться на вывод типа, чтобы определить таблицу, к которой относится ваш запрос. Например, если у меня есть следующие в моем файле «модели»:

User 
    name Text 
    age Int 

Login 
    user UserId 
    login Text 
    passwd Text 

Тогда я мог бы сделать это:

Just (Entity uid _)   <- selectFirst [ UserName ==. "Some User ] [] 
Just (Entity lid Login {..}) <- selectFirst [ LoginUser ==. uid ] [] 

И было бы знать, какие таблицы я имел в виду. Конечно, вы, вероятно, не хотите писать неполный код, как это, но я хотел бы подчеркнуть только запросы.

Смежные вопросы