<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=Python_sql_format</id>
	<title>Python sql format - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=Python_sql_format"/>
	<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=Python_sql_format&amp;action=history"/>
	<updated>2026-05-19T16:48:04Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=Python_sql_format&amp;diff=1283&amp;oldid=prev</id>
		<title>Devcafe: 새 문서: == Python sqlparse를 이용한 SQL 포맷팅 ==  * sqlparse는 Python으로 작성된 강력한 SQL 파싱 및 포맷팅 라이브러리  === 기본 설치 === &lt;source lang=bash&gt; pip install sqlparse &lt;/source&gt;  === 기본 사용 예제 === 간단한 SQL 포맷팅 &lt;source lang=python&gt; import sqlparse &lt;/source&gt; &lt;source lang=python&gt; raw_sql = &quot;&quot;&quot; SELECT * FROM users WHERE id=1 ORDER BY name; &quot;&quot;&quot;  formatted_sql = sqlparse.format(raw_sql, reindent=True, keyword_case=&#039;upper&#039;) print(f...</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=Python_sql_format&amp;diff=1283&amp;oldid=prev"/>
		<updated>2025-04-29T01:54:34Z</updated>

		<summary type="html">&lt;p&gt;새 문서: == Python sqlparse를 이용한 SQL 포맷팅 ==  * sqlparse는 Python으로 작성된 강력한 SQL 파싱 및 포맷팅 라이브러리  === 기본 설치 === &amp;lt;source lang=bash&amp;gt; pip install sqlparse &amp;lt;/source&amp;gt;  === 기본 사용 예제 === 간단한 SQL 포맷팅 &amp;lt;source lang=python&amp;gt; import sqlparse &amp;lt;/source&amp;gt; &amp;lt;source lang=python&amp;gt; raw_sql = &amp;quot;&amp;quot;&amp;quot; SELECT * FROM users WHERE id=1 ORDER BY name; &amp;quot;&amp;quot;&amp;quot;  formatted_sql = sqlparse.format(raw_sql, reindent=True, keyword_case=&amp;#039;upper&amp;#039;) print(f...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Python sqlparse를 이용한 SQL 포맷팅 ==&lt;br /&gt;
&lt;br /&gt;
* sqlparse는 Python으로 작성된 강력한 SQL 파싱 및 포맷팅 라이브러리&lt;br /&gt;
&lt;br /&gt;
=== 기본 설치 ===&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
pip install sqlparse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 기본 사용 예제 ===&lt;br /&gt;
간단한 SQL 포맷팅&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import sqlparse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
raw_sql = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
SELECT * FROM users WHERE id=1 ORDER BY name;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
formatted_sql = sqlparse.format(raw_sql, reindent=True, keyword_case=&amp;#039;upper&amp;#039;)&lt;br /&gt;
print(formatted_sql)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 출력 결과:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT *&lt;br /&gt;
FROM users&lt;br /&gt;
WHERE id = 1&lt;br /&gt;
ORDER BY name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 고급 포맷팅 옵션 ===&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import sqlparse&lt;br /&gt;
&lt;br /&gt;
sql = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
select u.id,u.name,count(o.id) as order_count from users u left join orders o on u.id=o.user_id &lt;br /&gt;
where u.status=&amp;#039;active&amp;#039; and o.date&amp;gt;=&amp;#039;2023-01-01&amp;#039; group by u.id,u.name having count(o.id)&amp;gt;5 &lt;br /&gt;
order by order_count desc;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 다양한 옵션 적용&lt;br /&gt;
formatted = sqlparse.format(&lt;br /&gt;
    sql,&lt;br /&gt;
    reindent=True,               # 들여쓰기 적용&lt;br /&gt;
    keyword_case=&amp;#039;upper&amp;#039;,        # 키워드 대문자로&lt;br /&gt;
    identifier_case=&amp;#039;lower&amp;#039;,     # 식별자 소문자로&lt;br /&gt;
    strip_comments=True,         # 주석 제거&lt;br /&gt;
    indent_width=4,              # 들여쓰기 4칸&lt;br /&gt;
    comma_first=False,           # 콤마 위치 (False: 뒤에, True: 앞에)&lt;br /&gt;
    use_space_around_operators=True  # 연산자 주변 공백&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
print(formatted)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
출력 결과:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT u.id,&lt;br /&gt;
       u.name,&lt;br /&gt;
       COUNT(o.id) AS order_count&lt;br /&gt;
FROM users u&lt;br /&gt;
LEFT JOIN orders o ON u.id = o.user_id&lt;br /&gt;
WHERE u.status = &amp;#039;active&amp;#039;&lt;br /&gt;
      AND o.date &amp;gt;= &amp;#039;2023-01-01&amp;#039;&lt;br /&gt;
GROUP BY u.id,&lt;br /&gt;
         u.name&lt;br /&gt;
HAVING COUNT(o.id) &amp;gt; 5&lt;br /&gt;
ORDER BY order_count DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SQL 구문 분석 및 수정 ===&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import sqlparse&lt;br /&gt;
&lt;br /&gt;
sql = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
INSERT INTO employees(id,name,dept) VALUES(1,&amp;#039;John&amp;#039;,&amp;#039;IT&amp;#039;);&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# SQL 파싱&lt;br /&gt;
parsed = sqlparse.parse(sql)[0]&lt;br /&gt;
&lt;br /&gt;
# 토큰별로 처리&lt;br /&gt;
for token in parsed.tokens:&lt;br /&gt;
    if isinstance(token, sqlparse.sql.IdentifierList):&lt;br /&gt;
        # 컬럼 목록을 각 줄에 하나씩 출력&lt;br /&gt;
        print(&amp;quot;Columns:&amp;quot;)&lt;br /&gt;
        for col in token.get_identifiers():&lt;br /&gt;
            print(f&amp;quot;- {col}&amp;quot;)&lt;br /&gt;
    elif isinstance(token, sqlparse.sql.Values):&lt;br /&gt;
        # VALUES 절 처리&lt;br /&gt;
        print(&amp;quot;Values:&amp;quot;)&lt;br /&gt;
        print(token)&lt;br /&gt;
&lt;br /&gt;
# 수정된 SQL 생성&lt;br /&gt;
formatted = sqlparse.format(&lt;br /&gt;
    sql,&lt;br /&gt;
    reindent=True,&lt;br /&gt;
    keyword_case=&amp;#039;upper&amp;#039;,&lt;br /&gt;
    wrap_after=80  # 80자에서 줄 바꿈&lt;br /&gt;
)&lt;br /&gt;
print(&amp;quot;\nFormatted SQL:&amp;quot;)&lt;br /&gt;
print(formatted)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 여러 SQL 문장 처리 ===&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import sqlparse&lt;br /&gt;
&lt;br /&gt;
multi_sql = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
CREATE TABLE users(id INT PRIMARY KEY,name VARCHAR(50)); &lt;br /&gt;
/* This is a comment */ INSERT INTO users VALUES(1,&amp;#039;Alice&amp;#039;); &lt;br /&gt;
UPDATE users SET name=&amp;#039;Bob&amp;#039; WHERE id=1;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 여러 SQL 문장 분리&lt;br /&gt;
statements = sqlparse.split(multi_sql)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;Found {len(statements)} SQL statements:\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for i, stmt in enumerate(statements, 1):&lt;br /&gt;
    formatted = sqlparse.format(stmt.strip(), reindent=True, keyword_case=&amp;#039;upper&amp;#039;)&lt;br /&gt;
    print(f&amp;quot;Statement {i}:&amp;quot;)&lt;br /&gt;
    print(formatted)&lt;br /&gt;
    print(&amp;quot;-&amp;quot; * 50)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 사용자 정의 포맷팅 함수 ===&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import sqlparse&lt;br /&gt;
from sqlparse.tokens import Keyword, Punctuation&lt;br /&gt;
&lt;br /&gt;
def custom_format(sql):&lt;br /&gt;
    formatted = []&lt;br /&gt;
    parsed = sqlparse.parse(sql)[0]&lt;br /&gt;
    &lt;br /&gt;
    for token in parsed.flatten():&lt;br /&gt;
        if token.ttype is Keyword:&lt;br /&gt;
            formatted.append(token.value.upper())&lt;br /&gt;
        elif token.ttype is Punctuation and token.value == &amp;#039;,&amp;#039;:&lt;br /&gt;
            formatted.append(&amp;#039;,\n    &amp;#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            formatted.append(str(token))&lt;br /&gt;
    &lt;br /&gt;
    return &amp;#039;&amp;#039;.join(formatted)&lt;br /&gt;
&lt;br /&gt;
sql = &amp;quot;select id,name,age from users where status=&amp;#039;active&amp;#039; order by name,age desc&amp;quot;&lt;br /&gt;
print(custom_format(sql))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
출력 결과:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SELECT id,&lt;br /&gt;
    name,&lt;br /&gt;
    age FROM users WHERE status=&amp;#039;active&amp;#039; ORDER BY name,&lt;br /&gt;
    age DESC&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 파일 처리 예제 ===&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import sqlparse&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
&lt;br /&gt;
def format_sql_file(input_file, output_file):&lt;br /&gt;
    with open(input_file, &amp;#039;r&amp;#039;) as f:&lt;br /&gt;
        raw_sql = f.read()&lt;br /&gt;
    &lt;br /&gt;
    formatted = sqlparse.format(&lt;br /&gt;
        raw_sql,&lt;br /&gt;
        reindent=True,&lt;br /&gt;
        keyword_case=&amp;#039;upper&amp;#039;,&lt;br /&gt;
        indent_width=2,&lt;br /&gt;
        wrap_after=100&lt;br /&gt;
    )&lt;br /&gt;
    &lt;br /&gt;
    with open(output_file, &amp;#039;w&amp;#039;) as f:&lt;br /&gt;
        f.write(formatted)&lt;br /&gt;
    print(f&amp;quot;Formatted SQL saved to {output_file}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 사용 예&lt;br /&gt;
format_sql_file(&amp;#039;input.sql&amp;#039;, &amp;#039;output.sql&amp;#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 주요 포맷팅 옵션&lt;br /&gt;
옵션	설명	기본값&lt;br /&gt;
reindent	들여쓰기 재조정	False&lt;br /&gt;
keyword_case	키워드 대소문자 (&amp;#039;upper&amp;#039;, &amp;#039;lower&amp;#039;, None)	None&lt;br /&gt;
identifier_case	식별자 대소문자	None&lt;br /&gt;
strip_comments	주석 제거	False&lt;br /&gt;
indent_width	들여쓰기 공백 수	2&lt;br /&gt;
wrap_after	줄 바꿈할 문자 수	0 (해제)&lt;br /&gt;
comma_first	콤마 위치 (True: 다음 줄 시작)	False&lt;br /&gt;
sqlparse는 SQL 문법을 이해하는 강력한 라이브러리로, 단순한 포맷팅부터 복잡한 SQL 분석까지 다양한 용도로 사용할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
[[category:python]]&lt;/div&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
</feed>