Delete tenant-scoped MySQL data by walking foreign-key relationships
Project description
Titto
Titto deletes tenant-scoped rows from a MySQL schema by reading table metadata, following foreign-key paths back to a tenant table, nulling optional references, and deleting rows in dependency order.
Warnings
This is a destructive database tool. Run it against production only after testing the exact command against a restored copy or staging database.
--commit permanently commits the deletes. Without --commit, Titto still runs
the UPDATE and DELETE statements inside a transaction, then rolls them back.
That dry run can still take locks, fire triggers, and affect non-transactional
tables.
Take a backup before any committed run. Prefer a database snapshot or logical dump that you have already tested restoring. Keep the backup until the tenant removal has been verified.
Usage
Show commands:
uv run titto --help
Dry-run a single-column tenant key and cache table metadata as JSON:
uv run titto delete "$DB_URL" tenant 42 --cache .tables.json
Commit the delete:
uv run titto delete "$DB_URL" tenant 42 --cache .tables.json --commit
Use a composite tenant key by passing each primary-key part as its own token:
uv run titto delete "$DB_URL" tenant 42 eu --cache .tables.json
Require selected tables to be empty for the tenant before deleting anything:
uv run titto delete "$DB_URL" tenant 42 --skip invoice --skip payment
Clean up unreferenced rows in tables that are not directly tenant-scoped:
uv run titto cleanup "$DB_URL" tenant --cache .tables.json
Clean up unreferenced rows in explicitly selected tables:
uv run titto cleanup-tables "$DB_URL" tag category --cache .tables.json
DB_URL is a MySQL URL such as:
mysql://user:password@localhost:3306/app_schema
Avoid putting real passwords directly in shell history. Use an environment variable, secret manager, or another shell-safe mechanism appropriate for your environment.
Cache Notes
--cache stores parsed table metadata as JSON. The recommended local cache path
is .tables.json; it is ignored by Git.
The cache is tied to the host, port, schema name, and cache format version. Titto
rejects mismatched cache metadata and reparses the database schema. If the schema
changes on the same host and schema name, delete .tables.json so Titto can
refresh it.
Development
Run the test suite:
uv run python -m unittest
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 titto-0.3.0.tar.gz.
File metadata
- Download URL: titto-0.3.0.tar.gz
- Upload date:
- Size: 8.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Alpine Linux","version":"3.23.4","id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f1e08cfd372d72385fe5147f5c635494b39531f291275b20442f18c258efc115
|
|
| MD5 |
40788b643bf9907a61aaa4cd1660915d
|
|
| BLAKE2b-256 |
2bc4bae3e1b7628dbc7a4fa259d0042180a41dfef48509ef5212f1c3821d0f0e
|
File details
Details for the file titto-0.3.0-py3-none-any.whl.
File metadata
- Download URL: titto-0.3.0-py3-none-any.whl
- Upload date:
- Size: 8.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Alpine Linux","version":"3.23.4","id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e896c69decb1afb2e7fbef56565f9ccdbfd71f28cb353602f864fbab793b28f
|
|
| MD5 |
2577f241f99e3b2f87b866c364aa06d5
|
|
| BLAKE2b-256 |
5a1d3ed2345b1c2cf44256cf6a5effee8533992dcba08825d95756e666e8f521
|