Metadata-Version: 2.4
Name: miu-db
Version: 0.1.4
Summary: Fast terminal SQL across your databases.
Project-URL: Homepage, https://github.com/vanducng/miu-db
Project-URL: Repository, https://github.com/vanducng/miu-db
Project-URL: Issues, https://github.com/vanducng/miu-db/issues
Project-URL: Changelog, https://github.com/vanducng/miu-db/blob/main/CHANGELOG.md
Author: Peter Adams
Author-email: Duc Nguyen <me@vanducng.dev>
License-Expression: MIT
License-File: LICENSE
Keywords: bigquery,database,miu-db,miumono,mysql,postgresql,snowflake,sql,sqlite,terminal,textual,tui
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Database
Requires-Python: >=3.10
Requires-Dist: docker>=7.0.0
Requires-Dist: keyring>=24.0.0
Requires-Dist: pyperclip>=1.8.2
Requires-Dist: sqlparse>=0.5.0
Requires-Dist: textual-fastdatatable>=0.14.0
Requires-Dist: textual[syntax]>=6.10.0
Provides-Extra: all
Requires-Dist: adbc-driver-flightsql>=1.0.0; extra == 'all'
Requires-Dist: clickhouse-connect>=0.7.0; extra == 'all'
Requires-Dist: duckdb>=1.1.0; extra == 'all'
Requires-Dist: firebirdsql>=1.3.5; extra == 'all'
Requires-Dist: google-cloud-bigquery; extra == 'all'
Requires-Dist: google-cloud-bigquery-storage; extra == 'all'
Requires-Dist: google-cloud-spanner>=3.0.0; extra == 'all'
Requires-Dist: hdbcli>=2.20.0; extra == 'all'
Requires-Dist: ibm-db>=3.2.0; extra == 'all'
Requires-Dist: impyla>=0.18.0; extra == 'all'
Requires-Dist: libsql>=0.1.0; extra == 'all'
Requires-Dist: mssql-python>=1.1.0; extra == 'all'
Requires-Dist: oracledb>=2.0.0; extra == 'all'
Requires-Dist: osquery>=3.0.0; extra == 'all'
Requires-Dist: paramiko<4.0.0,>=2.0.0; extra == 'all'
Requires-Dist: presto-python-client>=0.8.4; extra == 'all'
Requires-Dist: psycopg2-binary>=2.9.0; extra == 'all'
Requires-Dist: pyarrow; extra == 'all'
Requires-Dist: pyathena>=3.22.0; extra == 'all'
Requires-Dist: pymysql>=1.1.0; extra == 'all'
Requires-Dist: redshift-connector; extra == 'all'
Requires-Dist: requests>=2.32.4; extra == 'all'
Requires-Dist: snowflake-connector-python>=3.7.0; extra == 'all'
Requires-Dist: sshtunnel>=0.4.0; extra == 'all'
Requires-Dist: surrealdb>=1.0.0; extra == 'all'
Requires-Dist: teradatasql>=20.0.0; extra == 'all'
Requires-Dist: trino>=0.329.0; extra == 'all'
Provides-Extra: athena
Requires-Dist: pyathena>=3.22.0; extra == 'athena'
Provides-Extra: bigquery
Requires-Dist: google-cloud-bigquery; extra == 'bigquery'
Requires-Dist: google-cloud-bigquery-storage; extra == 'bigquery'
Requires-Dist: pyarrow; extra == 'bigquery'
Provides-Extra: clickhouse
Requires-Dist: clickhouse-connect>=0.7.0; extra == 'clickhouse'
Provides-Extra: cockroachdb
Requires-Dist: psycopg2-binary>=2.9.0; extra == 'cockroachdb'
Provides-Extra: d1
Requires-Dist: requests>=2.32.4; extra == 'd1'
Provides-Extra: db2
Requires-Dist: ibm-db>=3.2.0; extra == 'db2'
Provides-Extra: duckdb
Requires-Dist: duckdb>=1.1.0; extra == 'duckdb'
Provides-Extra: firebird
Requires-Dist: firebirdsql>=1.3.5; extra == 'firebird'
Provides-Extra: flight
Requires-Dist: adbc-driver-flightsql>=1.0.0; extra == 'flight'
Provides-Extra: hana
Requires-Dist: hdbcli>=2.20.0; extra == 'hana'
Provides-Extra: impala
Requires-Dist: impyla>=0.18.0; extra == 'impala'
Provides-Extra: mariadb
Requires-Dist: pymysql>=1.1.0; extra == 'mariadb'
Provides-Extra: mssql
Requires-Dist: mssql-python>=1.1.0; extra == 'mssql'
Provides-Extra: mysql
Requires-Dist: pymysql>=1.1.0; extra == 'mysql'
Provides-Extra: oracle
Requires-Dist: oracledb>=2.0.0; extra == 'oracle'
Provides-Extra: osquery
Requires-Dist: osquery>=3.0.0; extra == 'osquery'
Provides-Extra: postgres
Requires-Dist: psycopg2-binary>=2.9.0; extra == 'postgres'
Provides-Extra: presto
Requires-Dist: presto-python-client>=0.8.4; extra == 'presto'
Provides-Extra: redshift
Requires-Dist: redshift-connector; extra == 'redshift'
Provides-Extra: snowflake
Requires-Dist: snowflake-connector-python>=3.7.0; extra == 'snowflake'
Provides-Extra: spanner
Requires-Dist: google-cloud-spanner>=3.0.0; extra == 'spanner'
Provides-Extra: ssh
Requires-Dist: paramiko<4.0.0,>=2.0.0; extra == 'ssh'
Requires-Dist: sshtunnel>=0.4.0; extra == 'ssh'
Provides-Extra: surrealdb
Requires-Dist: surrealdb>=1.0.0; extra == 'surrealdb'
Provides-Extra: teradata
Requires-Dist: teradatasql>=20.0.0; extra == 'teradata'
Provides-Extra: trino
Requires-Dist: trino>=0.329.0; extra == 'trino'
Provides-Extra: turso
Requires-Dist: libsql>=0.1.0; extra == 'turso'
Description-Content-Type: text/markdown

<p align="center">
  <img src="https://raw.githubusercontent.com/vanducng/miu-db/main/assets/logo.png" alt="miu-db logo" width="128">
</p>

<h1 align="center">miu-db</h1>

<p align="center">
  <strong>Fast terminal SQL across your databases.</strong>
  <br>
  Pick a connection, write SQL, inspect results, stay in your shell.
</p>

<p align="center">
  <a href="https://github.com/vanducng/miu-db/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/vanducng/miu-db/ci.yml?branch=main" alt="CI"></a>
  <a href="https://pypi.org/project/miu-db/"><img src="https://img.shields.io/pypi/v/miu-db.svg" alt="PyPI"></a>
  <img src="https://img.shields.io/badge/python-3.10+-blue.svg" alt="Python">
  <img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License">
</p>

`miu-db` is part of the `miumono` umbrella: small, focused terminal-native
tools that are easy to install, easy to run locally, and predictable in CI.

## Quick Start

Install from PyPI:

```bash
uv tool install miu-db
miu-db
```

Try the TUI without a real database:

```bash
miu-db --mock=sqlite-demo
```

Run one query from the CLI:

```bash
miu-db query -c local -q "select 1"
```

## Source Install

For local development, install this checkout in editable mode. Code edits apply
the next time you run `miu-db`.

```bash
cd /Users/vanducng/git/personal/miu-db
uv tool install --force --editable ".[all]"
miu-db --mock=sqlite-demo
```

Re-run the install command after changing dependencies, entry points, or
`pyproject.toml`.

## Connections

Save local connections:

```bash
miu-db connections add sqlite --name local --file-path ./app.db
miu-db connections add postgresql --name pg --server localhost --database app --username app
miu-db connections add mysql --name mysql --server localhost --database app --username app
```

Connect without saving:

```bash
miu-db connect sqlite --file-path ./app.db
miu-db postgresql://user:pass@localhost:5432/app
miu-db mysql://root@localhost/app
```

Manage saved connections:

```bash
miu-db connections list
miu-db connections delete local
```

Passwords are stored in the OS keyring under the `miu-db` service when possible.

## Capabilities

- Terminal UI with explorer, SQL editor, and results grid.
- Vim-style normal/insert modes.
- Per-connection query history.
- Fuzzy filtering over result rows.
- Saved connections with keyring-backed passwords.
- Docker database discovery.
- SSH tunnels.
- Driver install hints when an adapter dependency is missing.

SQLite works out of the box. Optional adapters cover PostgreSQL, MySQL, SQL
Server, MariaDB, Oracle, DuckDB, ClickHouse, Snowflake, BigQuery, Athena,
Spanner, Turso, D1, Firebird, Redshift, Db2, HANA, Teradata, Trino, Presto,
Flight SQL, Impala, SurrealDB, osquery, and more.

## Keys

| Key | Action |
| --- | --- |
| `i` | Insert mode |
| `Esc` | Normal mode |
| `e` / `q` / `r` | Focus explorer / query / results |
| `Enter` | Run statement under cursor |
| `h` | Query history |
| `s` | Select top rows from table |
| `v` | View selected cell |
| `y` / `Y` | Copy cell / row |
| `<space>` | Command menu |
| `?` | Help |
| `Ctrl+Q` | Quit |

## Config

This is a brand-new `miu-db` app, not a legacy config alias.

- config: `~/.config/miu/db`
- override: `MIU_DB_CONFIG_DIR`
- env vars: `MIU_DB_*`
- keyring service: `miu-db`

```bash
miu-db config edit
miu-db config show-keymap
```

On first run, `miu-db` copies missing files from `~/.config/sqlit` into
`~/.config/miu/db` so existing saved connections keep working. Existing files
in the new location are never overwritten.

## Develop

```bash
uv sync --all-extras --dev
uv run miu-db --mock=sqlite-demo
uv run pytest tests/unit/test_config_dir_resolution.py -q
uv run pytest tests/test_sqlite.py -q --timeout=60
```

Build the package:

```bash
uv run python -m build
```

Release tags use miumono component SemVer:

```bash
miu-db-v0.1.4
```

## License

MIT
