데이터베이스 작업을 하다 보면 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 드라이버에서 그대로 사용 가능합니다.