<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Python_-_printsql.py</id>
	<title>Python - printsql.py - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Python_-_printsql.py"/>
	<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Python_-_printsql.py&amp;action=history"/>
	<updated>2026-06-05T03:16:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Python_-_printsql.py&amp;diff=294&amp;oldid=prev</id>
		<title>PeterHarding: New page: = Script =  Here is an interesting little script which parses SQL and then reformats it to stdout:  &lt;pre&gt; #!/usr/bin/env python # # Pretty print SQL statements # by Peter Bengtsson, www.pe...</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Python_-_printsql.py&amp;diff=294&amp;oldid=prev"/>
		<updated>2007-11-09T03:31:43Z</updated>

		<summary type="html">&lt;p&gt;New page: = Script =  Here is an interesting little script which parses SQL and then reformats it to stdout:  &amp;lt;pre&amp;gt; #!/usr/bin/env python # # Pretty print SQL statements # by Peter Bengtsson, www.pe...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Script =&lt;br /&gt;
&lt;br /&gt;
Here is an interesting little script which parses SQL and then reformats it to stdout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
#&lt;br /&gt;
# Pretty print SQL statements&lt;br /&gt;
# by Peter Bengtsson, www.peterbe.com&lt;br /&gt;
# August, 2004&lt;br /&gt;
&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
__version__=&amp;#039;0.1&amp;#039;&lt;br /&gt;
&lt;br /&gt;
def printsql(sql):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot; simple version of pprint for SQL strings &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    keywords = (&amp;#039;select&amp;#039;,&amp;#039;from&amp;#039;,&amp;#039;where&amp;#039;,&amp;#039;order by&amp;#039;,&amp;#039;desc&amp;#039;,&amp;#039;asc&amp;#039;,&lt;br /&gt;
                &amp;#039;limit&amp;#039;,&amp;#039;offset&amp;#039;,&amp;#039;update&amp;#039;,&amp;#039;delete&amp;#039;,&amp;#039;insert&amp;#039;,&amp;#039;set&amp;#039;,&lt;br /&gt;
                &amp;#039;having&amp;#039;,&amp;#039;group by&amp;#039;,&amp;#039;count&amp;#039;,&amp;#039;table&amp;#039;,&amp;#039;create&amp;#039;,&lt;br /&gt;
                &amp;#039;drop&amp;#039;,&amp;#039;and&amp;#039;,&amp;#039;or&amp;#039;,&amp;#039;in&amp;#039;,&amp;#039;ilike&amp;#039;,&amp;#039;like&amp;#039;,&lt;br /&gt;
                )&lt;br /&gt;
    aloner = lambda x: &amp;#039;(\s%s\s|^%s\s|\s%s$)&amp;#039;%(x,x,x)&lt;br /&gt;
&lt;br /&gt;
    re_flags = re.I|re.MULTILINE&lt;br /&gt;
    regex = &amp;#039;|&amp;#039;.join(map(aloner, keywords))&lt;br /&gt;
    anykeyword = re.compile(regex, re_flags)&lt;br /&gt;
    for each in anykeyword.findall(sql):&lt;br /&gt;
        each = list(each)&lt;br /&gt;
        while &amp;#039;&amp;#039; in each:each.remove(&amp;#039;&amp;#039;)&lt;br /&gt;
        for subeach in each:&lt;br /&gt;
            sql = sql.replace(subeach, subeach.upper())&lt;br /&gt;
&lt;br /&gt;
    if len(sql) &amp;gt; 10:&lt;br /&gt;
&lt;br /&gt;
        spad = &amp;#039;  &amp;#039;&lt;br /&gt;
&lt;br /&gt;
        regex = re.compile(&amp;#039;(SELECT\s(.*?))(\sFROM\s(.*?)\s)&amp;#039;, re_flags)&lt;br /&gt;
        found = regex.findall(sql)&lt;br /&gt;
        if found:&lt;br /&gt;
            sql = sql.replace(found[0][0], &amp;#039;SELECT\n%s%s\n&amp;#039;%(spad, found[0][1]))&lt;br /&gt;
            sql = sql.replace(found[0][2], &amp;#039;FROM\n %s\n&amp;#039;%found[0][3])&lt;br /&gt;
&lt;br /&gt;
        regex = re.compile(&amp;#039;(ORDER BY\s(.*?))(\sLIMIT\s(.*?)\s)&amp;#039;, re_flags)&lt;br /&gt;
        found = regex.findall(sql)&lt;br /&gt;
        if found:&lt;br /&gt;
            sql = sql.replace(found[0][0], &amp;#039;\nORDER BY %s\n&amp;#039;%found[0][1])&lt;br /&gt;
            sql = sql.replace(found[0][2], &amp;#039;LIMIT %s\n&amp;#039;%found[0][3])&lt;br /&gt;
&lt;br /&gt;
        regex = re.compile(&amp;#039;(\s+WHERE\s(.*?)\s(GROUP BY|ORDER BY|LIMIT))&amp;#039;, re_flags)&lt;br /&gt;
        found = regex.findall(sql)&lt;br /&gt;
        if found:&lt;br /&gt;
            sql = sql.replace(found[0][0],&lt;br /&gt;
                              &amp;#039;\nWHERE\n%s%s\n%s&amp;#039;%(spad, found[0][1],found[0][2]))&lt;br /&gt;
&lt;br /&gt;
    return sql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def test(s):&lt;br /&gt;
    print printsql(s)&lt;br /&gt;
    print&lt;br /&gt;
&lt;br /&gt;
if __name__==&amp;#039;__main__&amp;#039;:&lt;br /&gt;
    print &amp;quot;TESTING SOME SQL&amp;quot;&lt;br /&gt;
    print&lt;br /&gt;
    test(&amp;#039;select * from foo order by bar;&amp;#039;)&lt;br /&gt;
    test(&amp;#039;&amp;#039;&amp;#039;select id, bull, time from foobartable&lt;br /&gt;
    where time=1 and stuff=&amp;#039;yes&amp;#039; order by bar limit 30 offset 10;&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Output =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./printsql.py&lt;br /&gt;
TESTING SOME SQL&lt;br /&gt;
&lt;br /&gt;
SELECT&lt;br /&gt;
  *&lt;br /&gt;
FROM&lt;br /&gt;
 foo&lt;br /&gt;
ORDER BY bar;&lt;br /&gt;
&lt;br /&gt;
SELECT&lt;br /&gt;
  id, bull, time&lt;br /&gt;
FROM&lt;br /&gt;
 foobartable&lt;br /&gt;
WHERE&lt;br /&gt;
  time=1 AND stuff=&amp;#039;yes&amp;#039;&lt;br /&gt;
ORDER BY bar&lt;br /&gt;
LIMIT 30&lt;br /&gt;
OFFSET 10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
</feed>