mongodb wrapper in py
Signed-off-by: disqualifier <dev@disqualifier.me>
This commit is contained in:
commit
b79f965d07
15
.gitignore
vendored
Normal file
15
.gitignore
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
# claude
|
||||
CLAUDE.md
|
||||
|
||||
# python
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*.egg-info/
|
||||
build/
|
||||
dist/
|
||||
.eggs/
|
||||
|
||||
# env
|
||||
.venv/
|
||||
venv/
|
||||
.env
|
||||
67
README.md
Normal file
67
README.md
Normal file
@ -0,0 +1,67 @@
|
||||
# mongo
|
||||
|
||||
Async MongoDB wrapper over [motor](https://motor.readthedocs.io/). Thin, opinionated
|
||||
helpers for the common paths, with a raw escape hatch for everything else.
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
# requirements.txt
|
||||
mongo @ git+ssh://git@github.com/<org>/mongo.git@v0.1.0
|
||||
```
|
||||
|
||||
Requires `motor` and `pymongo` (pulled transitively).
|
||||
|
||||
## Usage
|
||||
|
||||
**Object (preferred)** — one client per process:
|
||||
|
||||
```python
|
||||
from mongo import Mongo
|
||||
|
||||
db = Mongo(conn_string, database) # attach as bot.db / app.db
|
||||
users = await db.get_documents("users", {"active": True})
|
||||
await db.close() # on shutdown
|
||||
```
|
||||
|
||||
**Module proxy (back-compat)** — arm once, then call bare:
|
||||
|
||||
```python
|
||||
import mongo # NOT `from mongo import ...`
|
||||
mongo.init(conn_string, database)
|
||||
users = await mongo.get_documents("users", {"active": True})
|
||||
```
|
||||
|
||||
Both styles share one client. The proxy exists so legacy call sites keep working
|
||||
after a one-line `init()`; new code should use the object.
|
||||
|
||||
## Error contract
|
||||
|
||||
- **Wrapped methods** log-and-swallow exceptions and return a safe default
|
||||
(`False` / `[]` / `{}` / `0` / `None`). Branch on the result.
|
||||
- **`db.collection(name)`** (or `db[name]`) returns the raw motor collection:
|
||||
full driver surface, no swallowing, **raises**. Use it for anything not wrapped
|
||||
(`find_one_and_*` beyond what's exposed, change streams, complex bulk ops).
|
||||
|
||||
## API
|
||||
|
||||
See the module docstring and method docstrings in `mongo.py` — that's the source
|
||||
of truth. Grouped as: collection/index management, create, read, update, delete,
|
||||
bulk, checks. Atomic ops (`find_one_and_update/replace/delete`) and `bulk_write`
|
||||
are included.
|
||||
|
||||
## Gotchas
|
||||
|
||||
- `from mongo import func` won't see the proxy (resolved at import, before `init`).
|
||||
Use `import mongo` then `mongo.func(...)`.
|
||||
- `find_one_and_update` returns the **after** image by default (`return_after=True`).
|
||||
- `bulk_write` takes pymongo ops the caller builds:
|
||||
```python
|
||||
from pymongo import UpdateOne
|
||||
ops = [UpdateOne({"_id": i}, {"$set": {...}}, upsert=True) for i in ids]
|
||||
await db.bulk_write("col", ops)
|
||||
```
|
||||
|
||||
## Versioning
|
||||
|
||||
Tagged `vX.Y.Z`. Pin the tag in `requirements.txt`; bump deliberately.
|
||||
Loading…
Reference in New Issue
Block a user