A simple and powerful NocoDB REST API client for Python
Project description
BAUER GROUP - NocoDB Simple Client
A simple and powerful Python client for interacting with NocoDB REST API. This client provides an intuitive interface for performing CRUD operations, managing file attachments, and handling complex queries on your NocoDB tables.
Repository Information:
- Version: v1.0.0 (2025-09-01)
- Repository: bauer-group/LIB-NocoDB_SimpleClient
- Branch: main
- Architecture: Modular, Reusable, Enterprise-Ready
🌟 Features
- Easy to Use: Intuitive API design with comprehensive documentation
- Full CRUD Operations: Create, read, update, and delete records with ease
- File Management: Upload, download, and manage file attachments
- Advanced Querying: Complex filtering, sorting, and pagination support
- Type Hints: Full type annotation support for better IDE experience
- Error Handling: Comprehensive exception handling with specific error types
- Context Manager: Automatic resource management with context manager support
- Flexible Configuration: Support for custom timeouts, redirects, and authentication
- Production Ready: Robust error handling and resource management
🚀 Quick Start
Installation
Install from PyPI using pip:
pip install nocodb-simple-client
Basic Usage
from nocodb_simple_client import NocoDBClient, NocoDBTable
# Initialize the client
client = NocoDBClient(
base_url="https://your-nocodb-instance.com",
db_auth_token="your-api-token"
)
# Create a table instance
table = NocoDBTable(client, table_id="your-table-id")
# Get records
records = table.get_records(limit=10)
print(f"Retrieved {len(records)} records")
# Create a new record
new_record = {
"Name": "John Doe",
"Email": "john@example.com",
"Age": 30
}
record_id = table.insert_record(new_record)
print(f"Created record with ID: {record_id}")
# Don't forget to close the client
client.close()
Using Context Manager (Recommended)
from nocodb_simple_client import NocoDBClient, NocoDBTable
with NocoDBClient(
base_url="https://your-nocodb-instance.com",
db_auth_token="your-api-token"
) as client:
table = NocoDBTable(client, table_id="your-table-id")
# Your operations here
records = table.get_records(where="(Status,eq,Active)", limit=5)
# Client automatically closes when exiting the context
📚 Documentation
Client Configuration
The NocoDBClient supports various configuration options:
client = NocoDBClient(
base_url="https://your-nocodb-instance.com",
db_auth_token="your-api-token",
access_protection_auth="your-protection-token", # Value for protection header
access_protection_header="X-Custom-Auth", # Custom header name (optional)
max_redirects=3, # Maximum number of redirects
timeout=30 # Request timeout in seconds
)
Access Protection Header
If your NocoDB instance is protected by a reverse proxy that requires a custom authentication header:
# Using default header name (X-BAUERGROUP-Auth)
client = NocoDBClient(
base_url="https://your-nocodb-instance.com",
db_auth_token="your-api-token",
access_protection_auth="your-protection-token"
)
# Using custom header name
client = NocoDBClient(
base_url="https://your-nocodb-instance.com",
db_auth_token="your-api-token",
access_protection_auth="your-protection-token",
access_protection_header="X-My-Custom-Auth"
)
CRUD Operations
Get Records
# Basic retrieval
records = table.get_records()
# With filtering and sorting
records = table.get_records(
where="(Age,gt,21)~and(Status,eq,Active)", # Age > 21 AND Status = Active
sort="-CreatedAt", # Sort by CreatedAt descending
fields=["Id", "Name", "Email"], # Select specific fields
limit=50 # Limit results
)
# Get a single record
record = table.get_record(record_id=123, fields=["Id", "Name"])
Create Records
# Insert a single record
new_record = {
"Name": "Jane Smith",
"Email": "jane@example.com",
"Active": True
}
record_id = table.insert_record(new_record)
Update Records
# Update an existing record
update_data = {
"Name": "Jane Doe",
"Status": "Updated"
}
updated_id = table.update_record(update_data, record_id=123)
Delete Records
# Delete a record
deleted_id = table.delete_record(record_id=123)
Count Records
# Count all records
total = table.count_records()
# Count with filter
active_count = table.count_records(where="(Status,eq,Active)")
File Operations
NocoDB Simple Client provides comprehensive file management capabilities:
Upload Files
# Attach a single file to a record
table.attach_file_to_record(
record_id=123,
field_name="Document",
file_path="/path/to/your/file.pdf"
)
# Attach multiple files (appends to existing files)
table.attach_files_to_record(
record_id=123,
field_name="Documents",
file_paths=["/path/file1.pdf", "/path/file2.jpg"]
)
Download Files
# Download the first file from a record
table.download_file_from_record(
record_id=123,
field_name="Document",
file_path="/path/to/save/downloaded_file.pdf"
)
# Download all files from a record
table.download_files_from_record(
record_id=123,
field_name="Documents",
directory="/path/to/download/directory"
)
Manage Files
# Remove all files from a field
table.delete_file_from_record(
record_id=123,
field_name="Document"
)
Advanced Filtering
NocoDB Simple Client supports sophisticated filtering options:
Comparison Operators
# Equality
records = table.get_records(where="(Status,eq,Active)")
# Numeric comparisons
records = table.get_records(where="(Age,gt,21)") # Greater than
records = table.get_records(where="(Age,gte,21)") # Greater than or equal
records = table.get_records(where="(Age,lt,65)") # Less than
records = table.get_records(where="(Age,lte,65)") # Less than or equal
# Text searches
records = table.get_records(where="(Name,like,%John%)") # Contains "John"
records = table.get_records(where="(Email,like,%.com)") # Ends with ".com"
Logical Operators
# AND conditions
records = table.get_records(where="(Status,eq,Active)~and(Age,gt,18)")
# OR conditions
records = table.get_records(where="(Status,eq,Active)~or(Status,eq,Pending)")
# Complex combinations
records = table.get_records(
where="((Status,eq,Active)~or(Status,eq,Pending))~and(Age,gt,18)"
)
NULL/Empty Checks
# Check for empty values
records = table.get_records(where="(Email,isblank)")
# Check for non-empty values
records = table.get_records(where="(Email,isnotblank)")
Sorting
# Single column sorting
records = table.get_records(sort="Name") # Ascending
records = table.get_records(sort="-CreatedAt") # Descending
# Multiple column sorting
records = table.get_records(sort="-Status,Name") # Status desc, then Name asc
🛡️ Error Handling
The client provides specific exceptions for different error scenarios:
from nocodb_simple_client import NocoDBException, RecordNotFoundException
try:
record = table.get_record(record_id=99999)
except RecordNotFoundException as e:
print(f"Record not found: {e.message}")
except NocoDBException as e:
print(f"NocoDB API error: {e.error} - {e.message}")
except Exception as e:
print(f"Unexpected error: {e}")
Exception Types
NocoDBException: Base exception for all NocoDB-related errorsRecordNotFoundException: Thrown when a requested record doesn't exist
🧪 Examples
Check out the examples/ directory for comprehensive examples:
- Basic Usage: CRUD operations and fundamentals
- File Operations: File upload/download examples
- Advanced Querying: Complex filtering and sorting
- Context Manager Usage: Proper resource management
📋 Requirements
- Python 3.8 or higher
requests >= 2.25.0requests-toolbelt >= 0.9.1
🔧 Development
Quick Setup
Use the automated setup script for your platform:
# Windows
scripts\setup.cmd
# macOS/Linux
./scripts/setup.sh
# Or run Python directly (cross-platform)
python scripts/setup.py
This will:
- Create a virtual environment
- Install all dependencies
- Setup pre-commit hooks
- Verify the installation
Manual Setup
- Clone the repository:
git clone https://github.com/bauer-group/LIB-NocoDB_SimpleClient.git
cd nocodb-simple-client
- Create and activate a virtual environment:
python -m venv venv
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activate
- Install development dependencies:
pip install -e ".[dev,docs]"
pre-commit install
Local Validation
Use these commands to validate your code locally:
Quick Validation
# Windows
scripts\quick-test.cmd
# macOS/Linux
./scripts/quick-test.sh
# Or cross-platform
python scripts/quick-test.py
Complete Validation
# Windows
scripts\validate.cmd
# macOS/Linux
./scripts/validate.sh
# Or cross-platform
python scripts/validate.py
Individual Commands
# Code formatting
black src/ tests/
ruff --fix src/ tests/
# Linting
ruff check src/ tests/
# Type checking
mypy src/nocodb_simple_client/
# Security scan
bandit -r src/
# Run tests
pytest
# Test with coverage
pytest --cov=src/nocodb_simple_client --cov-report=html
# Fast tests only (skip slow/integration tests)
pytest -m "not slow and not integration"
# Build package
python -m build
Using Makefile (macOS/Linux)
# See all available commands
make help
# Install dev dependencies
make install-dev
# Run all checks
make all-checks
# Quick test
make test-fast
# Format code
make format
# Generate coverage report
make test-cov
Pre-commit Hooks
Pre-commit hooks automatically run quality checks before each commit:
# Install hooks (done automatically by setup script)
pre-commit install
# Run manually on all files
pre-commit run --all-files
Build and Test Package
# Build package
python -m build
# Test installation
pip install dist/nocodb_simple_client-*.whl
# Clean build artifacts (Windows)
rmdir /s build dist *.egg-info
# Clean build artifacts (macOS/Linux)
rm -rf build/ dist/ *.egg-info/
Development Workflow
- Setup: Run setup script for your platform
- Code: Make your changes
- Quick Test: Run
python scripts/quick-test.py - Full Validation: Run
python scripts/validate.py - Commit: Pre-commit hooks will run automatically
- Push: CI will run full test suite
🤝 Contributing
We welcome contributions! Please see CONTRIBUTING.MD for details.
Quick Contribution Guide
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Add tests for new functionality
- Ensure all tests pass (
pytest) - Run code quality checks (
black .,ruff check .,mypy src/nocodb_simple_client) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 Acknowledgments
- NocoDB team for creating an amazing open-source Airtable alternative
- The Python community for excellent tooling and libraries
- Contributors who help improve this client
📞 Support
- Documentation: You're reading it! 📖
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: support@bauer-group.com
📊 Changelog
See CHANGELOG.MD for a detailed history of changes.
Made with ❤️ by BAUER GROUP
If this library helps you build something awesome, we'd love to hear about it!
Generated on 2025-09-01 20:25:56 UTC from docs/README.template.MD
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 nocodb_simple_client-1.1.0.tar.gz.
File metadata
- Download URL: nocodb_simple_client-1.1.0.tar.gz
- Upload date:
- Size: 66.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a35cb82289c6d894eaf186f4e95720da5e4de28423a856d7f39fae97b3dea1c
|
|
| MD5 |
97eba34e883b2122774a767f78b6a839
|
|
| BLAKE2b-256 |
be14fe6b6908fee51b866d053553758910b65082275ba8e1b5e1956e177d9a71
|
File details
Details for the file nocodb_simple_client-1.1.0-py3-none-any.whl.
File metadata
- Download URL: nocodb_simple_client-1.1.0-py3-none-any.whl
- Upload date:
- Size: 40.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66f9ce479fb55eb460f28a7268c185a8c139696e4147a3a26c41afe62c978117
|
|
| MD5 |
5263e5d6882eb4312d407d95e1aa1b71
|
|
| BLAKE2b-256 |
0c01afe6d71be2a38fa37f941e778a185ba2090ed9cf6f5715eceec4a7b755dd
|