Сохранить SQL в YAML как есть

Я хочу сохранить 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*/'} 

One Solution collect form web for “Сохранить SQL в YAML как есть”

Если ваш формат ввода – это какой-то неформатированный 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 ...."} 

Я предлагаю вам использовать другой подход и установить форматировщик sql, такой как sqlparse или format-sql, в сочетании с 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 с сохраненными символами новой строки :

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

Надеюсь, достаточно близко к тому, что вы хотели.

  • Разбор файла YAML в Python и доступ к данным?
  • pyyaml: демпинг без тегов
  • Изменение YAML с использованием ruamel.yaml добавляет дополнительные новые строки
  • Любые библиотеки yaml в Python, которые поддерживают демпинг длинных строк в виде блочных литералов или сложенных блоков?
  • Как предотвратить YAML для сбрасывания длинной строки без новой строки
  • Параметры конструктора по умолчанию в pyyaml
  • Yaml объединяется в Python
  • PyYAML и необычные теги
  • Python - лучший язык программирования в мире.