Snippets

Steven Berlan Convert SQLAlchemy SQL echos with parameters to sql statements

Created by Steven Berlan last modified
#!/usr/bin/env python
# Is this safe? Of course not, eval is evil. Be careful with inputs.

import datetime
import re
import sys
try:
    import sqlparse
    printer = lambda statement: sys.stdout.writelines([sqlparse.format(statement, reindent=True), '\n'])
except ImportError:
    sys.stderr.write('*** Python library `sqlparse` not found, could not beautify sql!\n\n')
    printer = lambda statement: sys.stdout.writelines([statement, '\n'])

def rep(_):
    param = params.pop()
    if isinstance(param, (datetime.datetime, datetime.date, datetime.time)):
        param = str(param)
    return "'{}'".format(param.replace('\'', '\\\'')) if isinstance(param, basestring) else str(param)

params, sql = [], ''
for line in sys.stdin.readlines():
    line = re.sub(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} INFO sqlalchemy.engine.base.Engine ', '', line.strip())
    if re.search(r'^(BEGIN|COMMIT|ROLLBACK)\b', line):
        printer(line.replace(' (implicit)', ''))
    elif line:
        try:
            params = eval(line)
            if isinstance(params, (tuple, list)):
                params = list(params)
                params.reverse()
                printer(re.sub(r'%s', rep, sql))
                sql = ''
            params = []
        except (NameError, SyntaxError):
            sql = '{}\n{}'.format(sql, line) if sql else line

# Get remaining statements
if sql.strip():
    params = list(params)
    params.reverse()
    printer(re.sub(r'%s', rep, sql))

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.