programing

SQLAlchemy에서 SQL 쿼리 인쇄를 예쁘게 포맷하는 방법

subpage 2023. 6. 13. 22:19
반응형

SQLAlchemy에서 SQL 쿼리 인쇄를 예쁘게 포맷하는 방법

SQLAlchemy를 사용하여 PL/SQL을 즉시 생성합니다.compile설정 및dialect그리고.compile_kwargs인수(예: 사용)str(ins.compile(dialect=oracle.dialect(), compile_kwargs={'literal_binds': True}))) 출력이 가장 예쁜 SQL 문으로 포맷되지 않은 것을 제외하고는 잘 작동합니다.

예를 들어, 출력 중 하나는 다음과 같습니다.

INSERT INTO my_table (a, b, c) SELECT my_table2.d, bar.e, bar.f
FROM my_table2 JOIN (SELECT my_table3.e AS e, max(my_table3.f) AS f, count(my_table3.g) AS g
FROM my_table3
WHERE my_table3.h = 'foo' GROUP BY my_table3.e
HAVING count(my_table3.g) = 1) bar ON my_table2.g = bar.g

대신, 저는 이것이 다음과 같이 출력되기를 원합니다.

INSERT INTO my _table (a, b c)
SELECT my_table2.d, bar.e, bar.f
FROM my_table2 JOIN (
    SELECT my_table3.e, max(my_table3.f), count(my_table3.g)
    FROM my_table3
    WHERE my_table3.h = 'foo'
    GROUP BY my_table3.e
    HAVING count(my_table3.g) = 1
) bar ON my_table2.g = bar.g

SQL 화학에서 SQL 문을 예쁘게 인쇄하려면 어떻게 해야 합니까?


복제 방법:

sqlalchemy 가져오기 테이블에서, 열, 문자열, 숫자, 함수, 선택sqlalchemy.message 가져오기 오라클에서my_table = table "my_table", column "a", String", column "b", string", column "c", string))my_table2 = table("my_table2"), 열("d', 문자열), 열("g", 문자열))my_table3 = table("my_table3"), column("d", String), column("e", String), column("f', 숫자"), column("g', String"), column("h')
inner_sel = 선택([my_table3.c.e, func.max(my_table3.c.f).label('f'), func.count(my_table3.c.g.label('g')]).여기서(my_table3.c.h=='foo'), group_by(my_table3.c.e), having(func.count(my_table3.c.g)==1.hbar').

outer_sel = 선택([my_table2.c.d, inner_sel.c.e, inner_sel.c.f]).select_from(my_table2.sel(sel_sel, my_table2.c.g==sel_sel.c.g)
ins = my_table.insert from_select([my_table.c.a, my_table.c.b, my_table.c.c.c], outer_sel)
print ins.dll(print ins.dll.dll) compile_kwargs={'dll_dll':참)

sqlparse 패키지를 사용할 수 있으며sqlparse.format(sql, reindent=True, keyword_case='upper')IT는 사용자가 원하는 대로 해야 합니다.

이 프로젝트는 성숙기(10년 이상)이며 여전히 매우 활발하게 진행되고 있습니다. sqlparseSQL 문을 구문 분석, 분할 및 형식 지정하는 것을 목표로 합니다.

다음 예제에서는 다음을 사용합니다.sqlparseSQL 파일 형식을 지정합니다.

import argparse
import sqlparse

# Parse command line arguments
parser = argparse.ArgumentParser(prog="pretty_print_sql")
parser.add_argument("file", type=argparse.FileType("r"), nargs="+")
args = parser.parse_args()

# Pretty print input files
for file in args.file:
    print(sqlparse.format(file.read(), reindent=True, keyword_case='upper'))

설치하기sqlparse사용.pip개인 용도:

python3 -m pip install sqlparse --user --upgrade

설치하기sqlparse사용.pipenv(프로젝트 내):

python3 -m pipenv install sqlparse

시도할 수 있는 몇 가지 옵션이 있습니다.

이 원숭이 패치를 사용해 보십시오.

pip install sqlparse

### monkeypatching SQL'Alchemy for pretty SQL query printing (((
from sqlalchemy.log import InstanceLogger


def pretty_log(self, level, msg, *args, **kwargs):
    if self.logger.manager.disable >= level:
        return

    selected_level = self._echo_map[self.echo]
    if selected_level == logging.NOTSET:
        selected_level = self.logger.getEffectiveLevel()

    if level >= selected_level:

        import sqlparse
        ### HERE IT IS ###
        msg = sqlparse.format(msg, reindent=True, keyword_case='upper')

        self.logger._log(level, '\n'+msg, args, **kwargs)

InstanceLogger.log = pretty_log
### )))

v_retouoHo의 예를 모두 따라 sqlparse를 사용하는 GitHub에서 배포하기 쉬운 스크립트를 만들었습니다.하나 이상의 SQL 파일을 처리하고 단일 파일에 대해 파이프로 연결할 수 있는 깨끗한 출력을 제공합니다.

출처는 다음과 같습니다.

import argparse, sqlparse, re

parser = argparse.ArgumentParser(prog="sqlpp")
parser.add_argument("--verbose", "-v", action='store_true')
parser.add_argument("file", type=argparse.FileType("r"), nargs="+")

args = parser.parse_args()

def prepend(s, s2): return s2 + re.sub('\n', '\n'+s2, s)

# Pretty print input files
n=len(args.file)
for i, file in enumerate(args.file):
    sIn = file.read().replace('\n', '')
    file.close()
    sOut = sqlparse.format(sIn, reindent=True, keyword_case='upper')
    if args.verbose or n > 1:
        print("File{0}:\n    {1}\n{2}\nFormatted SQL:\n{3}\n".format(
             (' ' + str(i+1) if n > 1 else '')
            ,file.name
            ,("\nOriginal SQL:\n{}\n".format(prepend(sIn, "    "))
                    if args.verbose else "")
            ,prepend(sOut, "    ")
        ))
    else:
        print(sOut)

언급URL : https://stackoverflow.com/questions/44335158/how-to-pretty-format-the-printing-of-sql-queries-in-sqlalchemy

반응형