IT/python

파이썬으로 안전하고 유연한 동적 SQL 쿼리 생성하기

generator 2025. 6. 18. 12:55

데이터베이스 작업을 하다 보면 SELECT, INSERT, UPDATE, DELETE 같은 SQL을 동적으로 생성해야 할 때가 많습니다. 파이썬에서는 딕셔너리를 기반으로 간결하고 안전하게 쿼리를 생성할 수 있습니다. 아래는 범용적으로 사용할 수 있는 함수 예시입니다.


SELECT 쿼리 생성 함수

def build_select_query(table, columns='*', where=None, order_by=None, limit=None, offset=None):
    if isinstance(columns, list):
        column_part = ', '.join(columns)
    else:
        column_part = columns

    query = f"SELECT {column_part} FROM {table}"
    params = []

    if where:
        conditions = []
        for key, value in where.items():
            if value is None:
                conditions.append(f"{key} IS NULL")
            else:
                conditions.append(f"{key} = %s")
                params.append(value)
        query += " WHERE " + " AND ".join(conditions)

    if order_by:
        query += f" ORDER BY {order_by}"

    if limit is not None:
        query += f" LIMIT %s"
        params.append(limit)

    if offset is not None:
        query += f" OFFSET %s"
        params.append(offset)

    return query, tuple(params)

사용 예:

query, params = build_select_query(
    table="users",
    columns=["id", "name", "email"],
    where={"status": "active", "age": 30},
    order_by="created_at DESC",
    limit=10,
    offset=20
)

INSERT 쿼리 생성 함수

def build_insert_query(table, data):
    columns = ', '.join(data.keys())
    placeholders = ', '.join(['%s'] * len(data))
    values = tuple(data.values())

    query = f"INSERT INTO {table} ({columns}) VALUES ({placeholders})"
    return query, values

사용 예:

query, params = build_insert_query(
    'users',
    {'name': 'Alice', 'email': 'alice@example.com', 'age': 30}
)

UPDATE 쿼리 생성 함수

def build_update_query(table, data, where):
    set_clause = ', '.join([f"{key} = %s" for key in data.keys()])
    where_clause = ' AND '.join([f"{key} = %s" for key in where.keys()])

    query = f"UPDATE {table} SET {set_clause} WHERE {where_clause}"
    params = tuple(data.values()) + tuple(where.values())

    return query, params

사용 예:

query, params = build_update_query(
    'users',
    {'name': 'Charlie', 'age': 40},
    {'id': 5}
)

DELETE 쿼리 생성 함수

def build_delete_query(table, where):
    if not where:
        raise ValueError("DELETE 쿼리는 반드시 WHERE 조건이 있어야 합니다!")

    where_clause = ' AND '.join([f"{key} = %s" for key in where.keys()])
    query = f"DELETE FROM {table} WHERE {where_clause}"
    params = tuple(where.values())

    return query, params

사용 예:

query, params = build_delete_query(
    'users',
    {'id': 5}
)

보안 팁

  • 위 쿼리는 %s 바인딩을 사용하는 방식으로 SQL Injection에 안전합니다.
  • psycopg2, pymysql, mysql-connector, sqlite3 등 다양한 DB 드라이버에서 그대로 사용 가능합니다.