Functional programming languages can be extremely beautiful when doing a task suited to them, but extremely ugly and cumbersome when doing anything not suited.
With an imperative language you can always fall back on C-style for loops and manipulating state. It may not be beautiful but it's fine. But if you need to use an STArray in Haskell, every single access is through a verbose function call without even array access syntax.
So I would suggest either finding a toy project to do in a pure functional language, or else use a mixed paradigm language and make maximum use of its functional features.
On databases, yeah database access is by definition stateful. It can be encapsulated in a monad, but that just means it's not a good fit for pure functional programming.