Skip to main content

The elegant and powerful SQLite3 ORM for Python

Project description

@mainpage

SQLSymphony

SQLSymphony: The elegant and powerful SQLite3 ORM for Python
Explore the docs »

Comparison with Alternatives . Why Choose SQLSymphony · Key Features · Getting Started · Basic Usage · Documentation · License


SQLSymphony: The elegant and powerful SQLite3 ORM for Python

SQLSymphony is a lightweight ✨, powerful 💪, and high-performance⚡️, Object-Relational Mapping (ORM) library for Python, designed to simplify the interaction with SQLite3 databases. It provides a Pythonic, object-oriented interface that allows developers to focus on their application's bussiness logic rather than the underlying database management.

SQLSymphony ORM - powerful and simple ORM for python

🌟 Comparison with Alternatives

Feature SqlSymphony SQLAlchemy Peewee
💫 Simplicity ✔️ ✔️ ✔️
🚀 Performance ✔️ ✔️
🌐 Database Agnosticism ✔️
📚 Comprehensive Documentation ✔️ ✔️ ✔️
🔥 Active Development ✔️ ✔️
💻 Audit changes & reverts ✔️
⚡ ASYNC Support COMING SOON ✔️

(back to top)

🤔 Why Choose SqlSymphony?

✨ Simplicity: SqlSymphony offers a straightforward and intuitive API for performing CRUD operations, filtering, sorting, and more, making it a breeze to work with databases in your Python projects.

💪 Flexibility: The library is designed to be database-agnostic, allowing you to switch between different SQLite3 implementations without modifying your codebase.

⚡️ Performance: SqlSymphony is optimized for performance, leveraging techniques like lazy loading and eager loading to minimize database queries and improve overall efficiency.

📚 Comprehensive Documentation: SqlSymphony comes with detailed documentation, including usage examples and API reference, to help you get started quickly and efficiently.

🔍 Maintainability: The codebase follows best practices in software engineering, including principles like SOLID, Clean Code, and modular design, ensuring the library is easy to extend and maintain.

🧪 Extensive Test Coverage: SqlSymphony is backed by a comprehensive test suite, ensuring the library's reliability and stability.

(back to top)

📚 Key Features

  • Intuitive API: Pythonic, object-oriented interface for interacting with SQLite3 databases.
  • Database Agnosticism: Seamlessly switch between different SQLite3 implementations.
  • Performance Optimization: Lazy loading, eager loading, and other techniques for efficient database queries.
  • Comprehensive Documentation: Detailed usage examples and API reference to help you get started.
  • Modular Design: Clean, maintainable codebase that follows best software engineering practices.
  • Extensive Test Coverage: Robust test suite to ensure the library's reliability and stability.

(back to top)

🚀 Getting Started

SQLSymphony is available on PyPI. Simply install the package into your project environment with PIP:

pip install sqlsymphony_orm

Once installed, you can start using the library in your Python projects. Check out the documentation for detailed usage examples and API reference.

(back to top)

💻 Usage Examples

(back to top)

Creating a Model

from sqlsymphony_orm.datatypes.fields import IntegerField, CharField, RealField, TextField, SlugField
from sqlsymphony_orm.models.orm_models import Model
from sqlsymphony_orm.database.manager import SQLiteMultiModelManager


class BankAccount(Model):
	__tablename__ = 'BankAccounts'
	__database__ = 'bank.db'

	id = IntegerField(primary_key=True)
	name = TextField(null=False)
	cash = RealField(null=False, default=0.0)

	def __repr__(self):
		return f'<BankAccount {self.id}>'


account = BankAccount(name='John', cash=100.0)
account2 = BankAccount(name='Bob', cash=100000000.0)
account2.save()
account2.commit()
account.save()
account.commit()

cash = float(input('Enter sum: '))
account.update(cash=account.cash + cash)
account.commit()
account2.update(cash=account2.cash - cash)
account2.commit()

print(account.cash, account2.cash)
print(BankAccount.objects.fetch())
print(BankAccount.objects.filter(name="Bob", first=True))

BankAccount.objects.drop_table()

mm_manager = SQLiteMultiModelManager('database.db')
mm_manager.add_model(account)
mm_manager.model_manager(account._model_name).create_table(account._table_name, account.get_formatted_sql_fields())
mm_manager.model_manager(account._model_name).insert(account._table_name, account.get_formatted_sql_fields(), account.pk, account)
mm_manager.model_manager(account._model_name).commit()
Cache Performance
from sqlsymphony_orm.performance.cache import cached, SingletonCache, InMemoryCache


@cached(SingletonCache(InMemoryCache, max_size=1000, ttl=60))
def fetch_data(param1: str, param2: str):
	return {'data': f'{param1} and {param2}'}

result1 = fetch_data('foo', 'bar')
print(result1) # caching
result2 = fetch_data('foo', 'bar')
print(result2) # cached

result3 = fetch_data('baz', 'qux')
print(result3) # not cached
RAW SQL Query
from sqlsymphony_orm.database.connection import SQLiteDBConnector
from sqlsymphony_orm.queries import raw_sql_query

connector = SQLiteDBConnector().connect('database.db')


@raw_sql_query(connector=connector, values=('John',))
def insert():
	return 'INSERT INTO Users (name) VALUES (?)'
Session SQL Query Executor
from sqlsymphony_orm.database.manager import SQLiteDatabaseSession
from sqlsymphony_orm.database.connection import SQLiteDBConnector

with SQLiteDatabaseSession(connector, commit=True) as session:
	session.fetch(
		"CREATE TABLE IF NOT EXISTS BALABOLA (id INTEGER PRIMARY KEY, name VarChar(32))"
	)
MultiModel Manager
from sqlsymphony_orm.datatypes.fields import IntegerField, CharField, RealField, TextField, SlugField
from sqlsymphony_orm.models.orm_models import Model
from sqlsymphony_orm.database.manager import SQLiteMultiModelManager


class BankAccount(Model):
	__tablename__ = 'BankAccounts'
	__database__ = 'bank.db'

	id = IntegerField(primary_key=True)
	name = TextField(null=False)
	cash = RealField(null=False, default=0.0)

	def __repr__(self):
		return f'<BankAccount {self.id}>'

account = BankAccount(name="John", cash=100.0)

mm_manager = SQLiteMultiModelManager('database.db')
mm_manager.add_model(account)
mm_manager.model_manager(account._model_name).create_table(account._table_name, account.get_formatted_sql_fields())
mm_manager.model_manager(account._model_name).insert(account._table_name, account.get_formatted_sql_fields(), account.pk, account)
mm_manager.model_manager(account._model_name).commit()
Drop table
from sqlsymphony_orm.datatypes.fields import IntegerField, CharField, RealField, TextField, SlugField
from sqlsymphony_orm.models.orm_models import Model


class BankAccount(Model):
	__tablename__ = 'BankAccounts'
	__database__ = 'bank.db'

	id = IntegerField(primary_key=True)
	name = TextField(null=False)
	cash = RealField(null=False, default=0.0)

	def __repr__(self):
		return f'<BankAccount {self.id}>'


account = BankAccount(name='John', cash=100.0)
account2 = BankAccount(name='Bob', cash=100000000.0)
account2.save()
account2.commit()
account.save()
account.commit()

cash = float(input('Enter sum: '))
account.update(cash=account.cash + cash)
account.commit()
account2.update(cash=account2.cash - cash)
account2.commit()

print(account.cash, account2.cash)
print(BankAccount.objects.fetch())
print(BankAccount.objects.filter(name="Bob", first=True))

BankAccount.objects.drop_table()

Performing CRUD Operations

Create a new record
user = User(name='Charlie')
user.save()
user.commit()

user2 = User(name='John')
user2.save()
user2.commit()

print(user.objects.fetch())
Update record
user2 = User(name="Carl")
user2.save()
user2.commit()

user2.update(name="Bobby")
user2.commit()

print(user2.objects.fetch())
Delete record
user = User(name="Charlie")
user.save()
user.commit()

user2 = User(name="Carl")
user2.save()
user2.commit()

user3 = User(name="John")
user3.save()
user3.commit()

user3.delete() # delete user3
# OR
user3.delete(field_name="name", field_value="Carl") # delete user2

user3.commit()

print(user.objects.fetch())
Filter
user = User(name="Charlie")
user.save()
user.commit()

user2 = User(name="Carl")
user2.save()
user2.commit()

user2.update(name="Bobby")
user2.commit()

user3 = User(name="John")
user3.save()
user3.commit()

user3.delete()
user3.commit()

print(user.objects.fetch())
print(user.objects.filter(name="Bobby"))

(back to top)

🔧 Specifications

Model Specification

The Model class is needed to create a model. It acts as an element in the database and allows, through the objects subclass, to manage other objects of the class through the object.

Self Variables

Model has some global variables that are needed to configure database fields:

  • __tablename__ - table name
  • __database__ - database filepath
  • __type__ - type of database. Default: ModelManagerType.SQLITE3.
  • _ids - the value from which the primary key calculation begins

The model also has the following parameters, which are set at the stage of creating a class object:

  • table_name - same as __tablename__
  • database_name - same as __database_name__
  • model_name - class model name. if __tablename__ or __database__ are None, then their value is changed to the class model name.
  • _original_fields - dictionary with original fields. The dictionary looks like this: '<field name>'='<field class>'
  • objects - an ModelManager instance. Example, if __type__ is ModelManagerType.SQLITE3, SQLiteModelManager.
  • fields - fields dictionary.
  • _hooks - a pre-action simple hooks dictionary.
  • audit_manager - an audit manager instance.
  • unique_id - an UUID4 of instance.
  • _last_action - dictionary storing the last action.

Methods

Model has some methods and functions for interactions with database:

  • pk (property) - a primary key value.
  • commit() - method for commit changes to database.
  • get_audit_history() - return audit history list.
  • view_table_info() - print beautiful table with some info about model
  • add_hook(before_action: str, func: Callable, func_args: tuple = ()) - add a hook.
  • save(ignore: bool = False) - insert model to database.
  • update(**kwargs) - update any value of model.
  • delete(field_name: str = None, field_value: Any = None) - delete self model or delete model by field name and value.
  • rollback_last_action() - revert last changes (one action)
  • get_formatted_sql_fields() - return an dictionary with formatted fields for sql query (ex. insert)

Objects Instance

Below you can see the methods belonging to the objects instance. Through it you can manage this and other instances of the model:

  • objects.drop_table(table_name: str=None) - drop table. If table_name is None, drop current model table, if table_name is not None, drop table by name.
  • insert(table_name: str, formatted_fields: dict, pk: int, model_class: 'Model', ignore: bool = False) - insert fields by model.
  • update(table_name: str, key: str, orig_field: str, new_value: str) - update element in database.
  • filter(first: bool=False, *args, **kwargs) - filter and get model by kwargs.
  • commit() - commit changes.
  • create_table(table_name: str, fields: dict) - create table.
  • delete(table_name: str, field_name: str, field_value: Any) - delete element from database.
  • fetch() - fetch last query and return fetched result.

💬 Support

If you encounter any issues or have questions about SqlSymphony, please:

(back to top)

🤝 Contributing

We welcome contributions from the community! If you'd like to help improve SqlSymphony, please check out the contributing guidelines to get started.

(back to top)

🔮 Roadmap

Our future goals for SqlSymphony include:

  • 📚 Expanding support for more SQLite3 features
  • 🚀 Improving performance through further optimizations
  • ✅ Enhancing the testing suite and code coverage
  • 🌍 Translating the documentation to multiple languages
  • 🔧 Implementing advanced querying capabilities
  • 🚀 Add asynchronous operation mode
  • ☑️ Add more fields
  • ✈️ Create Migrations system and Migrations Manager
  • ⌨️ Create ForeignKey field
  • ⌨️ Create RelationShip
  • 🖇️ Create more query-get methods

(back to top)

License

Distributed under the GNU GPL v3 License. See LICENSE for more information.

(back to top)

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

sqlsymphony_orm-0.2.9.tar.gz (22.8 kB view details)

Uploaded Source

Built Distribution

sqlsymphony_orm-0.2.9-py3-none-any.whl (23.1 kB view details)

Uploaded Python 3

File details

Details for the file sqlsymphony_orm-0.2.9.tar.gz.

File metadata

  • Download URL: sqlsymphony_orm-0.2.9.tar.gz
  • Upload date:
  • Size: 22.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.12.7 Linux/6.11.1-1-cachyos

File hashes

Hashes for sqlsymphony_orm-0.2.9.tar.gz
Algorithm Hash digest
SHA256 e8b051fd2bac1dfe503d7486e07fcca0ed2ac5b1d225e963a3801998ebe951e6
MD5 3aca86fd56c2d165f4b64a521018638f
BLAKE2b-256 66e3c841786846327039054767fba652621150d0bcf3c4515a1a5e74c1d52a8e

See more details on using hashes here.

File details

Details for the file sqlsymphony_orm-0.2.9-py3-none-any.whl.

File metadata

  • Download URL: sqlsymphony_orm-0.2.9-py3-none-any.whl
  • Upload date:
  • Size: 23.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.12.7 Linux/6.11.1-1-cachyos

File hashes

Hashes for sqlsymphony_orm-0.2.9-py3-none-any.whl
Algorithm Hash digest
SHA256 e53eec84d62fc328f068015cf389307699973debfc22030e4bd3df6cac203a62
MD5 b88c5edf336aa4042ccc648825b58571
BLAKE2b-256 3abd367549254d61130983ed273369a3be95c6c3185fe906f83bcd946c82b9ea

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page