I have previously written about SqlFun and how I really like the library and its quasi-static type checking. However, at work I'm currently working with Npgsql.FSharp from the great Zaid Ajaj. I also like this library a lot, although, I don't really appreciate some aspects of it.
You can see that someone also missed this functionality on issue #67. I volunteered to introduce it on the library too. In order to "fix" this issue, you can introduce the following code on your project:
namespace Npgsql.FShap
open Npgsql.FSharp
/// This module is an extension of the Npgsql.FSharp.Sql module
/// it contains useful functions not present on the library
[<RequireQualifiedAccess>]
module Sql =
/// Executes a query and returns an optional with the results
/// If no value is returned, returns None
/// If values are found, returns Some
let tryExecuteAsync read props =
task {
match! Sql.executeAsync read props with
| [] -> return None
| data -> return Some data
}
/// Executes a query and returns an optional with the first result
/// If no value is returned, returns None
/// If values are found, returns the first one
let tryExecuteRowAsync read props =
task {
match! tryExecuteAsync read props with
| None -> return None
| Some [] -> return None
| Some(data :: _) -> return Some data
}