Sling Academy
Home/SQLAlchemy/SQLAlchemy: How to Delete a Record by ID

SQLAlchemy: How to Delete a Record by ID

Last updated: January 03, 2024

Introduction

SQLAlchemy is a widely used Object-Relational Mapping (ORM) library for Python that simplifies database manipulation. In this tutorial, we will focus on deleting records by ID using SQLAlchemy, with clear steps and practical code examples.

Setting Up the Environment

Before diving into the SQL deletion process, ensure you have SQLAlchemy installed. You can install SQLAlchemy via pip:

pip install SQLAlchemy

Also, have a database instance running to which SQLAlchemy can connect. For this tutorial, we’ll assume you have an SQLite database with a table named User.

The User model in SQLAlchemy might look something like this:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)

engine = create_engine('sqlite:///mydatabase.db')
Base.metadata.bind = engine

DBSession = sessionmaker(bind=engine)

Basic Deletion Example

To start off, we will demonstrate the simplest way to delete a record by ID.

session = DBSession()
user_to_delete = session.query(User).get(YOUR_USER_ID)
if user_to_delete:
    session.delete(user_to_delete)
    session.commit()
else:
    print('User not found')

In this example, YOUR_USER_ID is the identifier of the record you want to delete.

Using a Transaction

To safely handle operations that can fail, we wrap them in a transaction.

session = DBSession()
try:
    user_to_delete = session.query(User).get(YOUR_USER_ID)
    if user_to_delete:
        session.delete(user_to_delete)
        session.commit()
    else:
        print('User not found')
except Exception as e:
    session.rollback()
    raise e
finally:
    session.close()

This ensures that in case of any errors during the deletion, the transaction will be rolled back to keep the database state consistent.

Deleting with Filters

You can also delete records conditionally by applying filters:

session = DBSession()
try:
    user_to_delete = session.query(User).filter(User.id == YOUR_USER_ID).one_or_none()
    if user_to_delete:
        session.delete(user_to_delete)
        session.commit()
    else:
        print('User not found')
except Exception as e:
    session.rollback()
    raise e
finally:
    session.close()

In the above code, one_or_none() function will either return one result or None, making it easier to handle the case where the user is not found.

Advanced Usage: Bulk Deletes

SQLAlchemy also supports bulk delete operations, which can be faster if you want to delete multiple records at once.

session = DBSession()
try:
    result = session.query(User).filter(User.id == YOUR_USER_ID).delete()
    session.commit()
    print('{} record(s) deleted'.format(result))
except Exception as e:
    session.rollback()
    raise e
finally:
    session.close()

The delete() function will delete all records that match the condition, and it returns the number of rows deleted.

Handling Relations and Cascades

When you delete a record from a table, you might also need to consider how this will affect related records. SQLAlchemy allows you to define cascade behaviors:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    posts = relationship('Post', cascade='delete, all')

This cascade='delete, all' option will automatically delete associated ‘Post’ records when a ‘User’ is deleted.

Secure Deletion Practices

Delete operations should be performed carefully, especially in production. It is a good practice to test your deletion logic on a development database first, and always to ensure a recent backup before executing any destructive actions on a production database.

Conclusion

Deleting records using SQLAlchemy is a straightforward process, whether you’re working with single or multiple records. Implement these examples as a guide and remember to handle transactions and relational data appropriately to maintain the integrity of your database. Needless to say, always proceed with caution when performing delete operations.

Next Article: SQLAlchemy Upsert: Update if Exists, Insert if Not

Previous Article: SQLAlchemy: How to Update a Record by ID

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