dbsys
dbsys is a comprehensive Python library for managing database operations using SQLAlchemy, pandas, and Redis. It provides a high-level interface for common database operations, including reading, writing, creating tables, deleting tables, columns, and rows, as well as advanced features like searching, backup, restore functionality, and Redis pub/sub support.
What's New in Version 0.7.9
- Fixed version mismatch issue for PyPI upload
- All features from version 0.7.8 are included:
- Updated dependency requirements for broader compatibility
- Enhanced Redis functionality with new methods for streams, JSON, lists, and strings
- Added
execon
method for executing functions on specific pubsub messages - Improved error handling and retry logic in Redis operations
- Updated documentation with examples for new Redis features
Features
- Easy-to-use interface for database operations
- Support for multiple database types through SQLAlchemy
- Redis support for pub/sub operations and key-value storage
- Integration with pandas for efficient data handling
- Comprehensive error handling and custom exceptions
- Backup and restore functionality
- Advanced search capabilities with case-sensitive option
- Deduplication of data
- Custom SQL query execution
- Support for Locksys objects as connection strings
- Improved Redis pub/sub functionality
Installation
You can install the latest version of dbsys using pip:
pip install --upgrade dbsys
For development purposes, you can install the package with extra dependencies:
pip install dbsys[dev]
This will install additional packages useful for development, such as pytest, flake8, and mypy.
Quick Start
Here's a comprehensive example of how to use dbsys with SQL databases:
from dbsys import DatabaseManager
import pandas as pd
db = DatabaseManager("sqlite:///example.db")
data = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [30, 25, 35, 28],
'city': ['New York', 'San Francisco', 'London', 'Berlin']
})
success = db.table("users").create(data)
print(f"Table created successfully: {success}")
result = db.table("users").read()
print("Original data:")
print(result)
result = db.table("users").search({"city": "London"})
print("\nUsers from London:")
print(result)
new_data = pd.DataFrame({
'name': ['Eve', 'Frank'],
'age': [22, 40],
'city': ['Paris', 'Tokyo']
})
success = db.table("users").write(new_data)
print(f"\nData updated successfully: {success}")
result = db.table("users").read()
print("\nUpdated data:")
print(result)
rows_deleted = db.table("users").delete_row({"name": "Frank"})
print(f"\nRows deleted: {rows_deleted}")
result = db.execute_query("SELECT AVG(age) as avg_age FROM users")
print("\nAverage age:")
print(result)
success = db.table("users").backup("users_backup.json")
print(f"\nBackup created successfully: {success}")
success = db.table("users").delete_table()
print(f"\nTable deleted successfully: {success}")
success = db.table("users").restore("users_backup.json")
print(f"\nTable restored successfully: {success}")
result = db.table("users").read()
print("\nRestored data:")
print(result)
Example of using dbsys with Redis:
from dbsys import DatabaseManager
import time
db = DatabaseManager("redis://localhost:6379/0")
subscribers = db.pub("Hello, Redis!", "test_channel")
print(f"Message published to {subscribers} subscribers")
def message_handler(channel, message):
print(f"Received on {channel}: {message}")
db.sub("test_channel", handler=message_handler)
db.pubsub("Test message", "pub_channel", "sub_channel", handler=message_handler, wait=5)
messages = db.get_stored_messages("sub_channel")
print("Stored messages:", messages)
db.clear_stored_messages()
API Reference
DatabaseManager
The main class for interacting with the database. It supports both SQL databases and Redis.
Constructor
DatabaseManager(connection_string: Union[str, 'Locksys'])
Initialize the DatabaseManager with a database URL or a Locksys object.
connection_string
: The connection string for the database or a Locksys object.
- For SQL databases, use SQLAlchemy connection strings.
- For Redis, use the format: "redis://[[username]:[password]]@localhost:6379/0"
- For Locksys objects, ensure they have a
get_connection_string()
method.
Methods
table(table_name: str) -> DatabaseManager
read() -> pd.DataFrame
write(data: pd.DataFrame) -> bool
create(data: pd.DataFrame) -> bool
delete_table() -> bool
delete_row(row_identifier: Dict[str, Any]) -> int
search(conditions: Union[Dict[str, Any], str], limit: Optional[int] = None, case_sensitive: bool = False) -> pd.DataFrame
backup(file_path: str, columns: Optional[List[str]] = None) -> bool
restore(file_path: str, mode: str = 'replace') -> bool
execute_query(query: str, params: Optional[Dict[str, Any]] = None) -> Union[pd.DataFrame, int]
pub(message: str, channel: str) -> int
sub(channel: str, handler: Optional[Callable[[str, str], None]] = None, exiton: str = "") -> DatabaseManager
pubsub(pub_message: str, pub_channel: str, sub_channel: str, handler: Optional[Callable[[str, str], None]] = None, exiton: str = "CLOSE", wait: Optional[int] = None) -> DatabaseManager
unsub(channel: Optional[str] = None) -> DatabaseManager
get_stored_messages(channel: str) -> List[str]
clear_stored_messages(channel: Optional[str] = None) -> DatabaseManager
For detailed usage of each method, including all parameters and return values, please refer to the docstrings in the source code.
Error Handling
dbsys provides custom exceptions for better error handling:
DatabaseError
: Base exception for database operations.TableNotFoundError
: Raised when a specified table is not found in the database.ColumnNotFoundError
: Raised when a specified column is not found in the table.InvalidOperationError
: Raised when an invalid operation is attempted.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature
) - Commit your changes (
git commit -m 'Add some AmazingFeature'
) - Push to the branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
License
This project is licensed under the MIT License. See the LICENSE file for details.
Support
If you encounter any problems or have any questions, please open an issue on our GitHub repository.
About Lifsys, Inc
Lifsys, Inc is an AI company dedicated to developing innovative solutions for data management and analysis. For more information, visit www.lifsys.com.
Changelog
0.7.9
- Fixed version mismatch issue for PyPI upload
0.7.8
- Updated dependency requirements for broader compatibility
- Enhanced Redis functionality with new methods for streams, JSON, lists, and strings
- Added
execon
method for executing functions on specific pubsub messages - Improved error handling and retry logic in Redis operations
- Updated documentation with examples for new Redis features
0.7.7
- Updated package metadata for improved PyPI representation
- Enhanced documentation with more detailed examples
- Minor bug fixes and performance optimizations
- Improved error handling in database operations
0.7.6
- Added new Redis-specific methods for working with streams, JSON, lists, and strings
- Introduced the
execon
method for executing functions on specific pubsub messages - Enhanced error handling and retry logic in Redis operations
- Updated documentation with examples for new Redis features
- Minor bug fixes and performance improvements
0.7.5
- Added type hints and py.typed file for better IDE support
- Improved error handling in Redis operations
- Enhanced documentation with more detailed examples
- Minor bug fixes and performance optimizations
- Updated package metadata for better PyPI representation
0.6.0
- Added support for Locksys objects as connection strings
- Updated API to remove the need for
results()
method - Enhanced error handling for connection string parsing
- Updated documentation and README
0.5.0
- Major refactoring of the codebase
- Updated API for better consistency and ease of use
- Enhanced Redis support with pubsub operations
- Improved error handling and logging
- Added case-sensitive option for search operations
- Updated documentation and README
(... previous changelog entries ...)