fork download
  1. import re
  2.  
  3. def to_positional(func, _pattern=re.compile(r"'(?:''|[^'])*'|--.*|:(\w+)")):
  4. def execute(operation, namespace):
  5. def replacer(match):
  6. if name := match[1]:
  7. params.append(namespace[name])
  8. return '?'
  9. return match[0]
  10. params = []
  11. return func(_pattern.sub(replacer, operation), params)
  12. return execute
  13.  
  14. sql = """\
  15. UPDATE products
  16. SET
  17. name=:name,
  18. price=:price,
  19. description=':description ''' || :description || ''''
  20. WHERE id=:id; -- :comment
  21. """
  22. data = {'id': 123, 'name': 'foo', 'price': 99.99, 'description': 'foo description'}
  23. to_positional(print)(sql, data)
Success #stdin #stdout 0.04s 9688KB
stdin
Standard input is empty
stdout
UPDATE products
SET
    name=?,
    price=?,
    description=':description ''' || ? || ''''
WHERE id=?; -- :comment
 ['foo', 99.99, 'foo description', 123]