ZFDB
A lightweight, pure Python library for file-based database operations with encryption support. ZFDB provides a secure and easy way to store and manage data in a local file system using ZIP archives.
Features
- 🔒 Password-based encryption
- 📁 ZIP-based storage with compression
- 🔍 Record search capabilities
- 🏷️ Metadata support
- ✅ Data integrity validation
- 🔄 Automatic compaction
- 💾 Backup functionality
- 📝 JSON support
- 🐍 Pure Python (no external dependencies)
Installation
Clone the repository or install the package using pip:
pip install zfdb
# or
git clone https://github.com/semolex/zfdb.git
cd zfdb
Quick Start
from zfdb import Database, DatabaseConfig
from pathlib import Path
# Create a database configuration
config = DatabaseConfig(
name="mydb",
path=Path("mydb.zip"),
password="secret123", # Optional
compression_level=9
)
# Initialize database
db = Database(config)
# Insert records
db.insert(
"user1",
'{"name": "John Doe", "email": "john@example.com"}',
metadata={"type": "user"}
)
# Read records
record = db.get("user1")
if record:
user_data = record.json # Parse as JSON
print(f"User: {user_data['name']}")
print(f"Record created: {record.metadata['created_at']}")
# Search records
results = db.search("user")
print(f"Found records: {results}")
# Create backup
db.backup("mydb_backup.zip")
Detailed Usage
Configuration
from zfdb import DatabaseConfig
from pathlib import Path
config = DatabaseConfig(
name="mydb", # Database name
path=Path("mydb.zip"), # Database file path
password="secret123", # Optional encryption password
compression_level=6, # ZIP compression level (0-9)
max_size=1024 * 1024 * 100, # Maximum database size (100MB)
auto_compact=True, # Enable automatic compaction
version="1.0.0" # Database version
)
Working with Records
Insert Records
# Insert JSON data
db.insert(
"config1",
'{"setting": "value"}',
metadata={"type": "configuration"}
)
# Insert text data
db.insert(
"note1",
"This is a text note",
metadata={"type": "note"}
)
# Insert binary data
db.insert(
"binary1",
b"\x00\x01\x02\x03",
metadata={"type": "binary"}
)
Read Records
# Get record
record = db.get("config1")
# Access data in different formats
raw_data = record.raw # bytes
text_data = record.text # str
json_data = record.json # parsed JSON
# Access metadata
created_at = record.metadata['created_at']
record_size = record.metadata['size']
Update Records
db.update(
"note1",
"Updated content",
metadata={"updated_at": datetime.utcnow().isoformat()}
)
Delete Records
db.delete("note1")
Database Management
List Records
all_records = db.list_records()
Search Records
# Search by name pattern
notes = db.search("note")
configs = db.search("config")
Database Maintenance
# Compact database (remove deleted records)
db.compact()
# Create backup
db.backup("backup.zip")
Data Security
ZFDB provides several security features:
- Password Protection: Database contents are encrypted using a password-derived key
- Data Integrity: Each record includes a SHA-256 checksum
- Size Limits: Configurable database size limits
- Validation: Automatic data integrity checking
Best Practices
- Regular Backups: Use the
backup()method regularly - Error Handling: Always handle potential exceptions:
try: record = db.get("key") except DatabaseError as e: logger.error(f"Database error: {e}")
- Resource Management: Close database when done:
try: # Use database finally: db.compact() # Optional cleanup
Limitations
- Not a real database
- Not suitable for concurrent access
- No built-in indexing
- Limited query capabilities
- Not recommended for very large datasets
- Simple encryption (not suitable for highly sensitive data)
Testing and linting
poetry run black zfdb/
poetry run isort zfdb/
poetry run mypy zfdb/
poetry run pytest tests/
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/yourfeature) - Commit your changes (
git commit -m 'Add some yourfeature') - Push to the branch (
git push origin feature/yourfeature) - Open a Pull Request
- Use
isort,mypyandblackfor code formatting and type checking
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
- Created to be used in local applications to persists data in case there is no other database available
- Inspired by simple key-value stores
- Built using Python standard library components
- Designed for simplicity and ease of use
Metadata
Release files for zfdb 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| zfdb-0.1.1.tar.gz | 6.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| zfdb-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 14.2 kB
Release files / zfdb-0.1.1.tar.gz
| Download URL | zfdb-0.1.1.tar.gz |
|---|---|
| Size | 6.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dbab8dbc80716be8e45e2ea542d4c5c41e542dc8e91d5e70dcb345c304fd0e91
|
|
BLAKE2b-256 checksum How to use checksums |
c21a28e32e383e4d968ca955606da03690653b20000f47288bb08c1e118c42bc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.8.3 CPython/3.9.13 Darwin/23.6.0
|
Release files / zfdb-0.1.1-py3-none-any.whl
| Download URL | zfdb-0.1.1-py3-none-any.whl |
|---|---|
| Size | 7.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d94555e4a6c8c1b501149c20735d3de6caca519f04f2c0d9dfa573d6367b737b
|
|
BLAKE2b-256 checksum How to use checksums |
98f6755440237b183ea48e71c0a8559d3bc564b02e3cbf74f2713af05bedfabd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.8.3 CPython/3.9.13 Darwin/23.6.0
|