Shoveler: A minimal desktop SQL workbench for DuckDB
Project description
DuckDB Workbench
A minimal desktop SQL workbench for DuckDB, built with Python and PySide6.
Setup (uv)
git clone https://github.com/mrmatho/shoveler
cd shoveler
uv sync
uv sync creates a .venv, installs all dependencies including the dev group,
and respects uv.lock if it exists. Run it again after pulling changes.
Running
uv run python -m shoveler
Testing
uv run pytest
Managing dependencies
uv add somepackage # add a runtime dependency
uv add --dev somepackage # add to the dev group (not published to PyPI)
uv remove somepackage # remove a dependency
uv lock # regenerate uv.lock without installing
uv sync # install from uv.lock
Commit uv.lock to the repository. It pins exact versions for reproducible installs.
Usage
- Open File — connect to an existing
.duckdbor.dbfile (green indicator) - New In-Memory — scratch database; data is lost when closed (amber indicator)
- File > Save Database As... — save current database state to a
.duckdbfile - Checkpoint — flush the write-ahead log to disk (file databases only)
- F5 or Ctrl+Enter — run query
- Select part of your SQL to run only that selection
- Double-click a table name in the schema panel to insert it into the editor
- View > Syntax highlighting — toggle SQL highlighting on or off; enabled by default and remembered between launches
Building a standalone Windows executable
The project includes shoveler.spec with the correct PyInstaller
configuration. Use this rather than running pyinstaller with flags directly —
the spec handles a non-obvious issue with DuckDB's compiled extension.
uv run pyinstaller shoveler.spec
Output is in dist/Shoveler/. Distribute that folder as a zip.
Why --onedir and not --onefile?
--onefile extracts everything to a temp directory on every launch, which makes
startup noticeably slow for a PySide6 app. --onedir is faster and easier to
debug if something goes wrong.
Known PyInstaller issue with DuckDB:
DuckDB's compiled core (_duckdb.pyd on Windows) lives outside the duckdb/
package directory. PyInstaller does not find it automatically. The spec file
uses collect_all('duckdb') which handles this correctly. If you ever regenerate
the spec from scratch, make sure this is included or the packaged app will fail
to start.
Extending
| Feature | Where to add it |
|---|---|
| More export formats | Add menu items in ResultsPanel._show_export_menu() — raw data is in _last_rows / _last_columns |
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file shoveler-0.1.0.tar.gz.
File metadata
- Download URL: shoveler-0.1.0.tar.gz
- Upload date:
- Size: 24.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd1905d7040a61907d291dacbad9d6d02811279a757de2ae6e721c2371843a69
|
|
| MD5 |
765e4007e2ae49a65fa6443da9339404
|
|
| BLAKE2b-256 |
947f2dbaaf632aaa1fb524ab7a14aff4129037582d5d0422e81ffa2c89fa7964
|
File details
Details for the file shoveler-0.1.0-py3-none-any.whl.
File metadata
- Download URL: shoveler-0.1.0-py3-none-any.whl
- Upload date:
- Size: 14.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bca70b4abab59887c7db23b1221769148d34f64e8e9e20bd21da86c7743283b2
|
|
| MD5 |
485cf8931b0cce5fcbe77aaf8fe4fe0a
|
|
| BLAKE2b-256 |
781238c6db911e9e0758c682a066e34bb4352bd6305ebc8057592541c8fbf0fa
|