Sling Academy
Home/SQLAlchemy/How to Set Unique Columns in SQLAlchemy

How to Set Unique Columns in SQLAlchemy

Last updated: January 03, 2024

Introduction

SQLAlchemy is a powerful Object-Relational Mapping (ORM) tool for Python, which allows developers to interact with databases using Python classes and objects. Ensuring the uniqueness of columns within a database table is crucial for maintaining data integrity, and SQLAlchemy provides intuitive syntax for defining unique constraints. This tutorial will guide you through various ways to set unique columns using SQLAlchemy, with step-by-step code examples.

Setting Up Your Environment

Before diving into setting unique columns, make sure you have SQLAlchemy and a database driver (like psycopg2 for PostgreSQL or PyMySQL for MySQL) installed. You can install SQLAlchemy using pip:

pip install SQLAlchemy

And then install the appropriate database driver for your database system.

Creating a Unique Column

To start, you define your database model by extending the Base class provided by SQLAlchemy:

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

Base = declarative_base()

engine = create_engine('sqlite:///example.db', echo=True)

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    username = Column(String, unique=True)

Here, the unique=True constraint designates the username field as unique, ensuring no two users have the same username.

Composite Unique Constraints

SQLAlchemy can also enforce uniqueness across multiple columns using composite unique constraints:

from sqlalchemy import UniqueConstraint

class Venue(Base):
    __tablename__ = 'venues'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    location = Column(String)
    UniqueConstraint('name', 'location', name='uq_venue_name_location')

The unique constraint ‘uq_venue_name_location’ ensures that no two venues have the same name and location.

Using Table Arguments

Alternatively, you can define the composite unique constraint inside the __table_args__ attribute:

class Venue(Base):
    __tablename__ = 'venues'
    __table_args__ = (UniqueConstraint('name', 'location', name='uq_venue_name_location'),)

    id = Column(Integer, primary_key=True)
    name = Column(String)
    location = Column(String)

This approach is neater and keeps all table-related configurations in one place.

Handling Unique Constraint Violations

Dealing with exceptions when unique constraints are violated is essential for robust code:

from sqlalchemy.exc import IntegrityError

try:
    new_user = User(username='existingusername')
    session.add(new_user)
    session.commit()
except IntegrityError:
    session.rollback()
    print('Username already exists!')

This snippet handles attempts to insert a duplicate username by catching IntegrityError and rolling back the session.

Altering Existing Tables

For existing tables that need to be altered to include a unique constraint, you can use Alembic, SQLAlchemy’s database migration tool:

from alembic import op

# Inside a migration script
def upgrade():
    op.create_unique_constraint('uq_username', 'users', ['username'])

def downgrade():
    op.drop_constraint('uq_username', 'users', type_='unique')

This will create and drop the unique constraint on the username field of the users table during migrations.

For more advanced scenarios, such as conditional uniqueness, you can use complex SQL expressions in conjunction with Index objects. However, these techniques are beyond the scope of this beginner-friendly tutorial.

Conclusion

Setting unique columns in SQLAlchemy is a straightforward process, thanks to its well-designed API. By the end of this tutorial, you should feel comfortable defining unique constraints in both simple and compound forms. As your applications grow, SQLAlchemy’s flexibility with more advanced patterns will become even more useful.

Next Article: SQLAlchemy: How to Insert a Record into a Table

Previous Article: How to Set Index 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