[파이썬] 데이터베이스 연동 시 예외 처리

When working with databases in Python, it is important to handle exceptions effectively. Exceptions are unexpected events that can occur during the database connection, query execution, and other database-related operations. Proper exception handling ensures that your application does not crash and can gracefully handle any errors that may occur. In this article, we will discuss some common exceptions that can occur during database interactions and how to handle them in Python.

Handling Connection Errors

When establishing a connection to a database, several issues can occur. These include network errors, authentication problems, or incorrect connection settings. To handle connection errors, you can use a try-except block and catch the relevant exceptions.

import psycopg2

try:
    connection = psycopg2.connect(
        host="localhost",
        database="mydatabase",
        user="myuser",
        password="mypassword"
    )
    # Perform database operations here
except psycopg2.OperationalError as error:
    print(f"Failed to connect to the database: {error}")

In the above example, we are using the psycopg2 library to connect to a PostgreSQL database. The connect function can raise the OperationalError exception if there are any issues connecting to the database. By catching this exception, we can provide a helpful error message to the user.

Handling Query Errors

Query errors can occur when executing SQL statements on the database. These can include syntax errors, constraint violations, or invalid data types. To handle query errors, you can catch the specific exceptions raised by the database library.

import psycopg2

try:
    connection = psycopg2.connect(
        host="localhost",
        database="mydatabase",
        user="myuser",
        password="mypassword"
    )
    cursor = connection.cursor()
    
    # Execute a query here
    cursor.execute("SELECT * FROM users")
    
    # Fetch the results
    rows = cursor.fetchall()
except (psycopg2.Error, psycopg2.DatabaseError) as error:
    print(f"An error occurred while executing the query: {error}")
finally:
    # Close the connection
    if connection:
        cursor.close()
        connection.close()

In the above example, we are using the psycopg2 library again. We execute a SELECT statement on the users table and fetch all the rows. If any error occurs during the query execution, the Error or DatabaseError exception will be caught and an appropriate error message will be printed. The finally block ensures that the connection is closed, regardless of whether an exception occurred or not.

Handling Transaction Errors

When performing multiple database operations as part of a transaction, it is necessary to handle errors that may occur during the transaction. To handle transaction errors, you can use a try-except block and rollback the transaction in case of an exception.

import psycopg2

try:
    connection = psycopg2.connect(
        host="localhost",
        database="mydatabase",
        user="myuser",
        password="mypassword"
    )
    connection.autocommit = False  # Enable transactions
    
    cursor = connection.cursor()
    
    # Start the transaction
    cursor.execute("BEGIN;")
    
    # Perform multiple database operations here
    
    # Commit the transaction
    connection.commit()
except (psycopg2.Error, psycopg2.DatabaseError) as error:
    print(f"An error occurred during the transaction: {error}")
    # Rollback the transaction
    connection.rollback()
finally:
    # Close the connection
    if connection:
        cursor.close()
        connection.close()

In the above example, we disable autocommit and start a transaction by executing the BEGIN; statement. If any error occurs during the transaction, the exception is caught, and the transaction is rolled back using the rollback() method. The finally block ensures that the connection is closed properly.

By implementing proper exception handling in your database interactions, you can ensure that your Python application handles errors gracefully and provides helpful error messages to users. This will improve the overall reliability and user experience of your application.