cnbdber


Namecnbdber JSON
Version 0.3.1 PyPI version JSON
download
home_pageNone
SummaryCNBDBer: Universal DB runner for SQL-like commands across SQLite/MySQL/PostgreSQL/MongoDB
upload_time2025-08-14 00:36:40
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords database cli sql sqlite mysql postgresql mongodb
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            CNBDBer

Universal DB runner for SQL-like commands across SQLite, MySQL, PostgreSQL, and MongoDB.

Install

- From PyPI (Python 3.9+):
```bash
pip install cnbdber
# optional extras
pip install 'cnbdber[mysql]'
pip install 'cnbdber[postgres]'
pip install 'cnbdber[mongo]'
pip install 'cnbdber[ssh]'  # for SSH tunnel support
```
Notes on SSH dependencies:

- The SSH tunnel feature relies on `sshtunnel` and `paramiko`. Some environments may emit Cryptography deprecation warnings (e.g., TripleDES). As of 0.3.1 these are suppressed internally so CLI and library output stays clean.
- If you pin dependencies yourself, ensure `paramiko<3` when using `sshtunnel`.
- From source (development):
```bash
pip install -e .
```

Config

- App config: `./.configs/cnbdber.config` (auto-created on first run)
- Logger config: `./.configs/cnblogger.config` (auto-created if missing)
- Logs: `./.logs/`

You can override the app config via `CNBDBER_CONFIG=/abs/path/to/cnbdber.config`.
The logger path is read from `cnbdber.config` and passed directly to `CNBLogger`.

See `.config-examples/` in this repo for ready-to-copy examples:

- `sqlite-cnbdber.config`
- `mysql-cnbdber.config`
- `postgres-cnbdber.config`
- `mongo-cnbdber.config`
- `mysql-direct.config`
- `mysql-ssh-same-creds.config`
- `mysql-ssh-different-creds.config`
- `postgres-direct.config`
- `postgres-ssh-same-creds.config`
- `postgres-ssh-different-creds.config`

Usage

Run a one-off command:
```bash
cnbdber -c "SELECT * FROM users LIMIT 5;"
```
Run from a file:
```bash
cnbdber --file ./query.sql
```
Specify a config explicitly:
```bash
cnbdber --config ./my-config.json -c "DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;"
```

- Library usage (import in Python)

Quick one-liner function:

```python
from cnbdber import cnbdber

# Use default/auto-created config
result = cnbdber("SELECT 1;")
print(result or "")

# Or pass a custom config path
result = cnbdber("SELECT * FROM users LIMIT 5;", "./my-config.json")
print(result or "")
```

Or use the config loader and backend helpers for finer control:

```python
from typing import Optional
from cnbdber import load_config, get_logger
from cnbdber.core import create_backend, run_command, create_backend_context

cfg = load_config()  # or load_config("./my-config.json")
logger = get_logger(cfg.logger_config_path, inline_config=cfg.logger)

with create_backend_context(cfg.target, logger) as backend:
  # DDL/DML: returns None on success
  ddl_result: Optional[str] = run_command(backend, "CREATE TABLE IF NOT EXISTS items(id INTEGER PRIMARY KEY, name TEXT);")

  insert_result: Optional[str] = run_command(backend, "INSERT INTO items(name) VALUES ('alpha');")

  # SELECT: returns tab-separated text (with header when available)
  select_result: Optional[str] = run_command(backend, "SELECT id, name FROM items ORDER BY id;")
  print(select_result or "")
```

To target MySQL/PostgreSQL/MongoDB, set `cfg.target` via `cnbdber.config` (see examples below) or construct a dict at runtime and pass it to `create_backend`.

- SQL backends (SQLite/MySQL/PostgreSQL): raw SQL is executed as-is.
- MongoDB: a minimal SQL-to-Mongo translation is supported for simple `SELECT/INSERT/UPDATE/DELETE` with equality-only `WHERE` clauses.

Example cnbdber.config

```json
{
  "logger_config_path": "./.configs/cnblogger.config",
  "target": {
    "type": "sqlite",
    "sqlite_path": "./example.db"
  }
}
```

Switch to MySQL:
```json
{
  "logger_config_path": "./.configs/cnblogger.config",
  "target": {
    "type": "mysql",
    "host": "127.0.0.1",
    "port": 3306,
    "user": "root",
    "password": "",          
    "password_file": "",      
    "database": "test"
  }
}
```

SSH tunnel (optional) for MySQL/PostgreSQL:
```json
{
  "logger_config_path": "./.configs/cnblogger.config",
  "target": {
    "type": "postgres",
    "host": "db.internal",
    "port": 5432,
    "user": "postgres",
    "password": "",
    "password_file": "~/.secrets/db.pass",
    "database": "app",
    "sslmode": "require",
    "ssh": {
      "enabled": true,
      "host": "bastion.example.com",
      "port": 22,
      "user": "ec2-user",
      "pkey_path": "~/.ssh/id_rsa",
      "pkey_password": "",
      "local_bind_host": "127.0.0.1",
      "local_bind_port": 0,
      "remote_host": "db.internal",
      "remote_port": 5432
    }
  }
}
```

Notes:
- When `password_file` is provided, it will be read and used instead of `password`.
- Using SSH requires extra `cnbdber[ssh]`.
- Warnings from `paramiko`/`cryptography` are suppressed beginning with 0.3.1. If you prefer to manage this yourself, remove the suppression and pin compatible versions instead.
- Always prefer the context manager (`create_backend_context`) to ensure SSH tunnels (if any) are cleaned up automatically.

License

MIT



            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "cnbdber",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "database, cli, sql, sqlite, mysql, postgresql, mongodb",
    "author": null,
    "author_email": "\"Mr. Clark\" <geoff@cnb.llc>",
    "download_url": "https://files.pythonhosted.org/packages/c4/86/3a5baedc95697f104512e2aa8fda41ccd602955dbdfc1be12b09e9f4d0d3/cnbdber-0.3.1.tar.gz",
    "platform": null,
    "description": "CNBDBer\n\nUniversal DB runner for SQL-like commands across SQLite, MySQL, PostgreSQL, and MongoDB.\n\nInstall\n\n- From PyPI (Python 3.9+):\n```bash\npip install cnbdber\n# optional extras\npip install 'cnbdber[mysql]'\npip install 'cnbdber[postgres]'\npip install 'cnbdber[mongo]'\npip install 'cnbdber[ssh]'  # for SSH tunnel support\n```\nNotes on SSH dependencies:\n\n- The SSH tunnel feature relies on `sshtunnel` and `paramiko`. Some environments may emit Cryptography deprecation warnings (e.g., TripleDES). As of 0.3.1 these are suppressed internally so CLI and library output stays clean.\n- If you pin dependencies yourself, ensure `paramiko<3` when using `sshtunnel`.\n- From source (development):\n```bash\npip install -e .\n```\n\nConfig\n\n- App config: `./.configs/cnbdber.config` (auto-created on first run)\n- Logger config: `./.configs/cnblogger.config` (auto-created if missing)\n- Logs: `./.logs/`\n\nYou can override the app config via `CNBDBER_CONFIG=/abs/path/to/cnbdber.config`.\nThe logger path is read from `cnbdber.config` and passed directly to `CNBLogger`.\n\nSee `.config-examples/` in this repo for ready-to-copy examples:\n\n- `sqlite-cnbdber.config`\n- `mysql-cnbdber.config`\n- `postgres-cnbdber.config`\n- `mongo-cnbdber.config`\n- `mysql-direct.config`\n- `mysql-ssh-same-creds.config`\n- `mysql-ssh-different-creds.config`\n- `postgres-direct.config`\n- `postgres-ssh-same-creds.config`\n- `postgres-ssh-different-creds.config`\n\nUsage\n\nRun a one-off command:\n```bash\ncnbdber -c \"SELECT * FROM users LIMIT 5;\"\n```\nRun from a file:\n```bash\ncnbdber --file ./query.sql\n```\nSpecify a config explicitly:\n```bash\ncnbdber --config ./my-config.json -c \"DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;\"\n```\n\n- Library usage (import in Python)\n\nQuick one-liner function:\n\n```python\nfrom cnbdber import cnbdber\n\n# Use default/auto-created config\nresult = cnbdber(\"SELECT 1;\")\nprint(result or \"\")\n\n# Or pass a custom config path\nresult = cnbdber(\"SELECT * FROM users LIMIT 5;\", \"./my-config.json\")\nprint(result or \"\")\n```\n\nOr use the config loader and backend helpers for finer control:\n\n```python\nfrom typing import Optional\nfrom cnbdber import load_config, get_logger\nfrom cnbdber.core import create_backend, run_command, create_backend_context\n\ncfg = load_config()  # or load_config(\"./my-config.json\")\nlogger = get_logger(cfg.logger_config_path, inline_config=cfg.logger)\n\nwith create_backend_context(cfg.target, logger) as backend:\n  # DDL/DML: returns None on success\n  ddl_result: Optional[str] = run_command(backend, \"CREATE TABLE IF NOT EXISTS items(id INTEGER PRIMARY KEY, name TEXT);\")\n\n  insert_result: Optional[str] = run_command(backend, \"INSERT INTO items(name) VALUES ('alpha');\")\n\n  # SELECT: returns tab-separated text (with header when available)\n  select_result: Optional[str] = run_command(backend, \"SELECT id, name FROM items ORDER BY id;\")\n  print(select_result or \"\")\n```\n\nTo target MySQL/PostgreSQL/MongoDB, set `cfg.target` via `cnbdber.config` (see examples below) or construct a dict at runtime and pass it to `create_backend`.\n\n- SQL backends (SQLite/MySQL/PostgreSQL): raw SQL is executed as-is.\n- MongoDB: a minimal SQL-to-Mongo translation is supported for simple `SELECT/INSERT/UPDATE/DELETE` with equality-only `WHERE` clauses.\n\nExample cnbdber.config\n\n```json\n{\n  \"logger_config_path\": \"./.configs/cnblogger.config\",\n  \"target\": {\n    \"type\": \"sqlite\",\n    \"sqlite_path\": \"./example.db\"\n  }\n}\n```\n\nSwitch to MySQL:\n```json\n{\n  \"logger_config_path\": \"./.configs/cnblogger.config\",\n  \"target\": {\n    \"type\": \"mysql\",\n    \"host\": \"127.0.0.1\",\n    \"port\": 3306,\n    \"user\": \"root\",\n    \"password\": \"\",          \n    \"password_file\": \"\",      \n    \"database\": \"test\"\n  }\n}\n```\n\nSSH tunnel (optional) for MySQL/PostgreSQL:\n```json\n{\n  \"logger_config_path\": \"./.configs/cnblogger.config\",\n  \"target\": {\n    \"type\": \"postgres\",\n    \"host\": \"db.internal\",\n    \"port\": 5432,\n    \"user\": \"postgres\",\n    \"password\": \"\",\n    \"password_file\": \"~/.secrets/db.pass\",\n    \"database\": \"app\",\n    \"sslmode\": \"require\",\n    \"ssh\": {\n      \"enabled\": true,\n      \"host\": \"bastion.example.com\",\n      \"port\": 22,\n      \"user\": \"ec2-user\",\n      \"pkey_path\": \"~/.ssh/id_rsa\",\n      \"pkey_password\": \"\",\n      \"local_bind_host\": \"127.0.0.1\",\n      \"local_bind_port\": 0,\n      \"remote_host\": \"db.internal\",\n      \"remote_port\": 5432\n    }\n  }\n}\n```\n\nNotes:\n- When `password_file` is provided, it will be read and used instead of `password`.\n- Using SSH requires extra `cnbdber[ssh]`.\n- Warnings from `paramiko`/`cryptography` are suppressed beginning with 0.3.1. If you prefer to manage this yourself, remove the suppression and pin compatible versions instead.\n- Always prefer the context manager (`create_backend_context`) to ensure SSH tunnels (if any) are cleaned up automatically.\n\nLicense\n\nMIT\n\n\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "CNBDBer: Universal DB runner for SQL-like commands across SQLite/MySQL/PostgreSQL/MongoDB",
    "version": "0.3.1",
    "project_urls": {
        "Homepage": "https://github.com/AznIronMan/cnbdber",
        "Repository": "https://github.com/AznIronMan/cnbdber.git"
    },
    "split_keywords": [
        "database",
        " cli",
        " sql",
        " sqlite",
        " mysql",
        " postgresql",
        " mongodb"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "85f78a316f9a8463dd85c6df7dcba34152b7131b74897d97578683b662b188ab",
                "md5": "ad82f0cde8fdf59339a6b542d4838a6b",
                "sha256": "66e62f21fde1b1d866dd743e292689c29f5ea21258d93b324f0d0ed1e1112dd7"
            },
            "downloads": -1,
            "filename": "cnbdber-0.3.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ad82f0cde8fdf59339a6b542d4838a6b",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 12145,
            "upload_time": "2025-08-14T00:36:38",
            "upload_time_iso_8601": "2025-08-14T00:36:38.001879Z",
            "url": "https://files.pythonhosted.org/packages/85/f7/8a316f9a8463dd85c6df7dcba34152b7131b74897d97578683b662b188ab/cnbdber-0.3.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c4863a5baedc95697f104512e2aa8fda41ccd602955dbdfc1be12b09e9f4d0d3",
                "md5": "af18d56b43a98dfb1af43977b6e22295",
                "sha256": "51345133eaef33a8e04e10c17f201692e71c940aab61cab390fb9376384cd579"
            },
            "downloads": -1,
            "filename": "cnbdber-0.3.1.tar.gz",
            "has_sig": false,
            "md5_digest": "af18d56b43a98dfb1af43977b6e22295",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 12285,
            "upload_time": "2025-08-14T00:36:40",
            "upload_time_iso_8601": "2025-08-14T00:36:40.321728Z",
            "url": "https://files.pythonhosted.org/packages/c4/86/3a5baedc95697f104512e2aa8fda41ccd602955dbdfc1be12b09e9f4d0d3/cnbdber-0.3.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-14 00:36:40",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "AznIronMan",
    "github_project": "cnbdber",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "cnbdber"
}
        
Elapsed time: 0.93920s