我想以自己的格式将SQL保存到YAML文件,如下所示:
(1) sql: SELECT DISTINCT p.id_product, p.price AS price, sp.reduction AS discount FROM ....
我使用以下YAML设置
yaml.safe_dump(app_config, stream, indent=4, default_flow_style=False, encoding='utf-8', allow_unicode=True)
但是我得到了YAML的“经典”丑陋输出
(2) sql: SELECT DISTINCT p.id_product, p.price AS price, sp.reduction AS discount, sp.reduction_type AS discount_type, pl.description_short AS description FROM ....
有什么办法可以实现输出#1?
PS。repr(config)等于:
{'mapping': {'/*ID_LANG*/': 'AND pl.id_lang IN (/*VALUE*/)', '/*REFERENCE*/': "AND p.reference LIKE '%/*VALUE*/%'", }, 'sql': 'SELECT DISTINCT p.id_product, p.price AS price, sp.reduction AS discount, sp.reduction_type AS discount_type, pl.description_short AS description, pl.name AS name, i.id_image as image, p.reference AS model, m.name AS manufacturer, pl.available_now AS stock_status FROM /*PREFIX*/product p LEFT JOIN /*PREFIX*/product_lang pl ON (p.id_product = pl.id_product) LEFT JOIN /*PREFIX*/manufacturer m ON (m.id_manufacturer = p.id_manufacturer) LEFT JOIN /*PREFIX*/image i ON (i.id_product = p.id_product) LEFT JOIN /*PREFIX*/specific_price sp ON (sp.id_product = p.id_product) LEFT JOIN /*PREFIX*/category pc ON p.id_category_default = pc.id_category WHERE i.cover = 1 /*WHERE*/'}
如果您的输入格式是一些未格式化的SQL(没有换行符和缩进空格),就像您似乎从输出(2)中 获取的那样,您将 永远不会 自动获得良好的输出:
import yaml sql = ("SELECT DISTINCT p.id_product, " "p.price AS price, " "sp.reduction AS discount, " "sp.reduction_type AS discount_type, " "pl.description_short AS description " "FROM ....") app_config = dict(sql=sql) print yaml.dump(app_config)
会给你:
{sql: 'SELECT DISTINCT p.id_product, p.price AS price, sp.reduction AS discount, sp.reduction_type AS discount_type, pl.description_short AS description FROM ....'}
如您所知。您可以尝试使用换行符和缩进来对字符串进行手工格式化
app_config = dict(sql="""\ SELECT DISTINCT p.id_product, p.price AS price, sp.reduction AS discount, sp.reduction_type AS discount_type, pl.description_short AS description FROM ....""") print yaml.dump(app_config)
但是输出并不好:
{sql: "SELECT DISTINCT p.id_product,\n p.price AS price,\n \ \ sp.reduction AS discount,\n sp.reduction_type AS discount_type,\n\ \ pl.description_short AS description\n FROM ...."}
我建议您采用其他方法,并结合ruamel.yaml(我是PyYAML增强版的作者)安装sqlparse或format- sql之类的sql格式化程序,该格式程序支持多行文字字符串往返。在一点帮助下,它也可以用于生成正确且更好(如果不是更好)的YAML输出。
你可以做:
import ruamel.yaml from ruamel.yaml.scalarstring import PreservedScalarString import sqlparse sql = ("SELECT DISTINCT p.id_product, " "p.price AS price, " "sp.reduction AS discount, " "sp.reduction_type AS discount_type, " "pl.description_short AS description " "FROM ....") fsql = sqlparse.format(sql, reindent=True, keyword_case="upper").encode('utf-8') app_config = dict(sql=PreservedScalarString(fsql)) print ruamel.yaml.dump(app_config, Dumper=ruamel.yaml.RoundTripDumper)
并获得带有保留的换行符的YAML文字标量:
sql: |- SELECT DISTINCT p.id_product, p.price AS price, sp.reduction AS discount, sp.reduction_type AS discount_type, pl.description_short AS description FROM ....
希望距离您想要的足够近。