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년 이상)이며 여전히 매우 활발하게 진행되고 있습니다. sqlparse
SQL 문을 구문 분석, 분할 및 형식 지정하는 것을 목표로 합니다.
다음 예제에서는 다음을 사용합니다.sqlparse
SQL 파일 형식을 지정합니다.
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_retou와 oHo의 예를 모두 따라 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
'programing' 카테고리의 다른 글
C/C++: do-while(0)을 사용하는 방법; C4127과 같은 컴파일러 경고 없이 구성? (0) | 2023.06.13 |
---|---|
Oracle 10에서 잠금 제거 (0) | 2023.06.13 |
RVM 설치 중 "gpg: command not found" 오류를 해결하는 방법은 무엇입니까? (0) | 2023.06.13 |
Excel의 단일 차원 변형 배열에 있는 요소의 수 (0) | 2023.06.13 |
R 데이터 프레임의 각 행에 대해 (0) | 2023.06.13 |