Преобразовать набор результатов в список хеш-таблиц в Chicken Scheme
Какой самый простой способ преобразовать набор результатов в список хеш-таблиц? Я новичок в Схеме и предпочел бы использовать библиотечную функцию, а не свою собственную. Я использую Цыпленок Схема с яйцом postgres. Спасибо!
(use postgresql)
(define conn (connect '((dbname . "thedb") (user . "foo") (password . "secret") (host . "somehost"))))
(define rs (query conn "select id, name from users"))
(row-map print rs)
;(row-map ??? rs) ;what would take the place of the ??? here that would convert the row a hashtable so I end up with a list of hashtables?
1 ответ
Это не работает так. row-map вызывает процедуру с записью в качестве позиционных аргументов, поэтому вы можете получить их только позиционным способом. Конечно, если вы знаете позиции, вы можете сделать что-то вроде этого:
(row-map* (lambda (id name)
(alist->hash-table `((id . ,id) (name . ,name))))
(query conn "SELECT id, name FROM users"))
Это будет не очень эффективно, но работает достаточно хорошо. Я бы не советовал вам использовать хеш-таблицы, потому что они не очень удобны в использовании. Я бы предпочел списки в любой день недели для коротких списков; они более эффективны для небольшого набора ключей.
Но что-то еще: почему вы конвертируете в хеш-таблицу? Более эффективно один раз просмотреть цикл результатов и выполнить вычисления внутри этой лямбды. В противном случае вы преобразуете полный результирующий набор в список хеш-таблиц, а затем сборщик мусора соберет результирующий набор. Предположительно, вы собираетесь повторить этот список еще раз (зачем еще создавать список?). Поэтому вместо того, чтобы делать это, просто поместите ваш код обработки в лямбду, описанную выше, и сохраните дополнительный обход.