# `Lotus.Runner`
[🔗](https://github.com/typhoonworks/lotus/blob/v0.16.6/lib/lotus/runner.ex#L1)

SQL execution with safety checks, param binding, and result shaping.

By default, all queries are read-only. Destructive operations (INSERT, UPDATE,
DELETE, DDL) are blocked at both the application and database level. Pass
`read_only: false` to allow write operations.

# `opts`

```elixir
@type opts() :: [
  timeout: non_neg_integer(),
  statement_timeout_ms: non_neg_integer(),
  read_only: boolean(),
  search_path: String.t() | nil
]
```

# `params`

```elixir
@type params() :: list()
```

# `query_result`

```elixir
@type query_result() :: Lotus.Result.t()
```

# `repo`

```elixir
@type repo() :: module()
```

# `sql`

```elixir
@type sql() :: String.t()
```

# `run_sql`

```elixir
@spec run_sql(repo(), sql(), params(), opts()) ::
  {:ok, query_result()} | {:error, term()}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
