按原样将 SQL 保存到 YAML

2024-05-16

我想以我自己的格式将 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吗?

附言。代表(配置)等于:

{'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) 中获取的那样,您将never自动获得不错的输出:

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 ...."}


我建议你采取不同的方法并安装一个 sql 格式化程序,例如sqlparse https://pypi.python.org/pypi/sqlparse or 格式-sql https://pypi.python.org/pypi/format-sql结合鲁梅尔.yaml https://pypi.python.org/pypi/ruamel.yaml(我是 PyYAML 增强版的作者),它支持多行文字字符串往返。借助一点帮助,它还可以用于生成正确且外观更好(如果不是更好)的 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 文字标量 http://yaml.org/spec/1.2/spec.html#%7C%20literal%20style//:

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 ....

希望足够接近你想要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按原样将 SQL 保存到 YAML 的相关文章

随机推荐

  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • 如何从连接矩阵绘制图像?

    我想编写一个脚本来从连接矩阵创建图像 基本上 只要矩阵中有 1 我就希望该区域在图像中被着色 对于例如 我使用 Photoshop 创建了这张图像 但我有一个很大的数据集 所以我必须自动化这个过程 如果有人能指出我正确的方向 那将非常有帮助
  • 解析日期不正确

    My code DateFormat format new SimpleDateFormat dd MM YYYY Date Today format parse today Date Date format parse date diff
  • 创建 AoT 兼容的服务工厂

    我正在尝试为缓存服务创建一个服务工厂 主要要求是每次可以使用不同的字符串实例化单个服务 最终的结果会有多个cache每个服务都由唯一定义databaseName 每个缓存可以有一个或多个stores也由唯一定义storeName 其他服务将
  • caffe reshape / 上采样全连接层

    假设我们有一个像这样的层 layer name fully connected type InnerProduct bottom bottom top top inner product param num output 1 输出是batc
  • ES2015 中 `export { foo as default }` 有效吗?

    我收到了GitHub 上的问题 https github com benmosher eslint plugin import issues 54关于我的 ES2015 模块导入 导出验证插件 ESLint 无法识别default使用以下语
  • 左值引用和右值引用之间的重载解析

    include
  • 如何通过Android应用程序将数据发送到蓝牙打印机?

    我正在开发一个应用程序 它将通过蓝牙将数据发送到打印机进行打印 收据热敏打印机 我已按照此链接中的代码进行操作 http pastie org 6203514 http pastie org 6203514这个链接也http pastie
  • Cloud Firestore 安全规则 - 文档中的单个受保护字段

    我想要一个名为的只读属性suspendedProfile in a user具有当前登录用户的读 写访问权限的所有其他属性的文档 有没有办法通过简单的安全规则来做到这一点 我想到了2个解决方案 禁止修改属性的写入 例如allow write
  • 获取 GitHub 问题的管道价值?

    我使用 ZenHub 来管理 GitHub 上的问题 当我查看问题的详细信息时 我可以在 GitHub 中看到属性 pipeline 这正是保存问题的列 Now I want to get the pipeline information
  • 如何将旋转器从右向左对齐?

    谁能告诉我我做错了什么 我有 2 个 Spinner 和两个 TextView 我想将它们右对齐 我已将所有内容设置为右侧 但所有内容仍然左对齐 它是这样的 但我也希望它看起来像这样 这是我的 XML 代码
  • 如何在netbeans中创建属性文件

    我正在开发一个 struts2 Web 应用程序项目并使用 netbeans 6 9 我想为我的项目创建一个属性文件 我该如何在net beans中做到这一点 右键单击要添加属性文件的位置 new gt other gt other gt
  • 如何从 pandas 数据框中的列中删除字符串值

    我正在尝试编写一些代码 以逗号分隔数据帧列中的字符串 因此它成为一个列表 并从该列表中删除某个字符串 如果存在 删除不需要的字符串后 我想再次以逗号加入列表元素 我的数据框如下所示 df Column1 Column2 0 a a b c
  • 如何在 asp.net mvc 中跨应用程序进行表单身份验证

    如何在 asp net mvc 中跨应用程序进行表单身份验证 假设有两个网站 www xyz com 和 www abc com 我必须对两个站点使用相同的用户凭据 如果我将一个应用程序重定向到另一个应用程序 那么它不会要求登录 如果应用程
  • 在回调函数中调用目标c函数

    如何在回调函数中调用目标c函数 回调函数 static OSStatus inputRenderCallback void inRefCon AudioUnitRenderActionFlags ioActionFlags const Au
  • 在 Seaborn 中为 python 创建箱线图 FacetGrid

    我正在尝试在seaborn中为4个箱线图创建一个4x4 FacetGrid 每个箱线图根据虹膜数据集中的虹膜种类分为3个箱线图 目前 我的代码如下所示 sns set style whitegrid iris vis sns load da
  • Heroku 上的 OpenCV 错误,但模型部署成功

    我正在尝试在 Heroku 上部署深度学习 Flask 应用程序 它已成功部署 但仍然给我Application Error信息 我检查了日志 但没有发现任何内容 帮我 构建日志 gt Building on the Heroku 20 s
  • 如何解决:“MongoError:此图集层不允许使用 $where”?

    使用 MongoDB Atlas 时如何解决 MongoError where is not allowed in this atlas tier 这是我的代码 async function getEventsTakingPlace con
  • 静态初始化

    上下文 我正在开发一个具有一些 模块 的项目 我在这里所说的模块是一个简单的类 它实现特定的功能并派生自强制接口的抽象类 GenericModule 未来应该会添加新的模块 模块的多个实例可以同时加载 也可以不加载 具体取决于配置文件 我认
  • 按原样将 SQL 保存到 YAML

    我想以我自己的格式将 SQL 保存到 YAML 文件 如下所示 1 sql SELECT DISTINCT p id product p price AS price sp reduction AS discount FROM 我使用 YA