A few years ago, I shared a bit of Vimscript for highlighting SQL strings inside Ruby code. Fast forward to today: I’ve been doing a bunch of ETL work recently using Apache Airflow, which is written in Python. That means a bunch of SQL queries embedded in Python strings, and I wanted to see about getting some highlighting on them for easier visual parsing.
In the Ruby version, I relied on the convention of using
<<-SQL heredoc strings to differentiate between regular strings and ones containing SQL queries. In Python, I had to get slightly more clever: this will treat any triple quotes-delimited string as SQL if it starts with a valid SQL keyword (e.g.
alter, etc). That might not always be true in your case, but it works pretty well for the very SQL-heavy Python work I’ve been doing.
Drop this in
unlet b:current_syntax syn include @SQL syntax/sql.vim syntax region sqlPythonString \ matchgroup=SpecialComment \ start=~\z('''\|"""\)\_s*\(ALTER\|BEGIN\|CALL\|COMMENT\|COMMIT\|CONNECT\|CREATE\|DELETE\|DROP\|END\|EXPLAIN\|EXPORT\|GRANT\|IMPORT\|INSERT\|LOAD\|LOCK\|MERGE\|REFRESH\|RENAME\|REPLACE\|REVOKE\|ROLLBACK\|SELECT\|SET\|TRUNCATE\|UNLOAD\|UNSET\|UPDATE\|UPSERT\|WITH\)~ \ end=+\z1+ \ contains=@SQL let b:current_syntax = 'python'