我正在使用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
如何让SQLAlchemy漂亮地打印SQL语句?
要复制:
from sqlalchemy import table, column, String, Numeric, func, select
from sqlalchemy.dialects import oracle
my_table = table('my_table', column('a', String), column('b', String), column('c', String))
my_table2 = table('my_table2', column('d', String), column('g', String))
my_table3 = table('my_table3', column('d', String), column('e', String), column('f', Numeric), column('g', String), column('h', String))
inner_sel = select([my_table3.c.e, func.max(my_table3.c.f).label('f'), func.count(my_table3.c.g).label('g')]).where(my_table3.c.h=='foo').group_by(my_table3.c.e).having(func.count(my_table3.c.g)==1).alias('bar')
outer_sel = select([my_table2.c.d, inner_sel.c.e, inner_sel.c.f]).select_from(my_table2.join(inner_sel, my_table2.c.g==inner_sel.c.g))
ins = my_table.insert().from_select([my_table.c.a, my_table.c.b, my_table.c.c], outer_sel)
print ins.compile(dialect=oracle.dialect(), compile_kwargs={'literal_binds': True})
5条答案
按热度按时间vdzxcuhz1#
您可以使用sqlparse包和
sqlparse.format(sql, reindent=True, keyword_case='upper')
应该做您想要的?zazmityj2#
项目
sqlparse
已经成熟(10年以上),并且仍然非常活跃。sqlparse
旨在解析、拆分和格式化SQL语句。以下示例使用
sqlparse
来美化SQL文件的格式:要使用
pip
安装sqlparse
以供个人使用:要使用
pipenv
安装sqlparse
(在项目内):jucafojl3#
有几个选项可以尝试:
j2cgzkjk4#
试试这个猴子补丁:
pip install sqlparse
iqxoj9l95#
按照@v_retoux和@olibre的例子,我在GitHub上创建了一个易于部署的脚本,它使用sqlparse处理一个或多个sql文件,并且有一个干净的输出,可以通过管道传输单个文件。
以下是来源: