Sling Academy
Home/SQLAlchemy/How to enable/disable auto-commit in SQLAlchemy

How to enable/disable auto-commit in SQLAlchemy

Last updated: January 03, 2024

Getting Started

SQLAlchemy is an ORM (Object Relational Mapper) that facilitates the interaction between Python programs and databases by providing a high-level abstraction upon a database engine. This means you can write Pythonic code instead of SQL to work with your database.

Understanding transactional control is crucial in application development. This guide focuses on managing auto-commit in SQLAlchemy – a powerful tool for interfacing with databases in Python.

Before diving into the specifics of auto-commit, it is important to install SQLAlchemy:

pip install SQLAlchemy

To start using SQLAlchemy, you need to perform the initial setup:

from sqlalchemy import create_engine

# Replace the below string with your actual database URL
engine = create_engine('YOUR_DATABASE_URL')

Understanding Auto-Commit

Auto-commit refers to the behavior of a transactional database system where each SQL statement constitutes a transaction that is automatically committed right after it is executed. However, this might not be desired for operations that should only be saved when all associated tasks succeed.

In SQLAlchemy, auto-commit is governed by the configuration of the session. The session in SQLAlchemy manages all database communications and is the central interface for ORM operations.

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)
session = Session()

Disabling Auto-Commit

By default, auto-commit is disabled in SQLAlchemy when using the ORM. This requires manual commits after operations:

my_object = MyTable(name='SQLAlchemy Guide')
session.add(my_object)
# Changes are not yet persisted
session.commit()
# Now changes are saved to the database

A noteworthy feature is the context manager provided by SQLAlchemy for a transaction scope, ensuring that changes are committed or rolled back:

from sqlalchemy.exc import SQLAlchemyError

try:
    with session.begin():
        session.add(my_object)
except SQLAlchemyError:
    session.rollback()
    raise

Enabling Auto-Commit

To enable auto-commit, you can explicitly mention it when creating your session:

Session = sessionmaker(bind=engine, autocommit=True)

This can be useful for read-only operations. However, for update operations, it should be turned off as follows:

session = Session(autocommit=False)
session.add(my_object)
session.commit()

In more complex scenarios such as when using an asynchronous environment with SQLAlchemy, controlling transaction boundaries can be crucial. Here’s an advanced example:

from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession

async_engine = create_async_engine('YOUR_DATABASE_URL', echo=True)

async def insert_data():
    async with AsyncSession(async_engine, autocommit=False) as session:
        async with session.begin():
            session.add_all([
                MyTable(name='Async Commit'),
                MyTable(name='Another Async Commit')
            ])
        # The transaction is automatically committed on exit from the block

Transaction Isolation and Propagation

Transaction isolation levels can also affect how the auto-commit behaves. Isolation specifies how transaction integrity is visible to other users and systems. SQLAlchemy allows you to set this per session:

Session = sessionmaker(bind=engine, isolation_level='SERIALIZABLE')

Furthermore, propagation parameters can assist in advanced transaction management and participating in larger transactions:

session = Session(begin_transaction=False)

Best Practices

Here are some best practices when working with auto-commit in SQLAlchemy:

  • Avoid using auto-commit for bulk operations or when exact transaction control is needed.
  • Understand the pitfalls: auto-committing too frequently can affect performance due to constant I/O operations to database storage.
  • Be aware of the specific transactional consistency your application’s business logic needs before enabling auto-commit.

Conclusion

Auto-commit control is a powerful feature in SQLAlchemy offering efficiency and safety when dealing with database transactions. Proper usage can ensure data integrity and performance optimization. Whether you enable or disable auto-commit, remember to tailor it to your application’s needs and follow best practices to maintain transactional control.

Next Article: SQLAlchemy: Perform Case-Insensitive Filter

Previous Article: How to enable/disable caching in SQLAlchemy

Series: SQLAlchemy Tutorials: From Basic to Advanced

SQLAlchemy

You May Also Like

  • SQLAlchemy: Counting rows for each category (2 approaches)
  • SQLAlchemy: Adding a calculated column to SELECT query
  • SQLAlchemy: Grouping data on multiple columns
  • SQLAlchemy: How to temporarily delete a row
  • SQLAlchemy Composite Indexes: The Complete Guide
  • Full-Text Search in SQLAlchemy: The Ultimate Guide
  • SQLAlchemy: What if you don’t close database connections?
  • SQLAlchemy: How to Remove FOREIGN KEY Constraints (2 Ways)
  • SQLAlchemy: How to Create and Use Temporary Tables
  • SQLAlchemy: Saving Categories and Subcategories in the Same Table
  • SQLAlchemy: How to Automatically Delete Old Records
  • Weighted Random Selection in SQLAlchemy: An In-Depth Guide
  • SQLAlchemy: created_at and updated_at columns
  • How to Use Regular Expressions in SQLAlchemy
  • SQLAlchemy: Ways to Find Results by a Keyword
  • SQLAlchemy: How to Connect to MySQL Database
  • SQLAlchemy: How to Bulk Insert Data into a Table
  • SQLAlchemy: How to Update a Record by ID
  • SQLAlchemy: Singular vs Plural Table Names