jinja2 "set" 语句中的文字简单引用
Literal simple quote inside jinja2 "set" statement
我正在尝试让 mysql 查询在 jinja2 "set" 语句(salt 上下文)中工作,如:
{% set KEY = salt.cmd.shell("mysql -u user -p'password' -D ann -h ann -B -N -e 'select T from ann.USER where NAME='key''") %}
我已经苦思冥想几个小时了,所以如果有人有办法实现这个,请继续!
我尝试了很多(我的意思是很多)不同的组合来完成这项工作,但我做不到。
我想到的最好的是这个 mysql 错误:
ERROR 1054 (42S22) at line 1: Unknown column 'key' in 'where clause'
我可以通过不在 "key" 周围使用简单的引号在 mysql 实例上重现,所以对我来说这确实是一个引用问题。
Jinja2 渲染器在将命令传递给 shell 之前只是删除了简单的引号,对吗?
编辑:
自私的答案起到了作用(非常感谢)但现在我意识到我需要在 "where clause" 中添加一些神社,并且(我猜)因为引用(地狱? ) jinja 变量无法解释。
有没有办法对 where 子句中的列名(键)进行正确的神社解释?
如:
salt.cmd.shell("mysql -uroot -ppassword -h ann -D ann -B -N -e \'select T from ann.USER where NAME=\"{{ key }}\"\' 2>/dev/null; exit 0")
编辑 2:
修复 jinja {{ key }} 的第二个提议失败了:
[salt.state :275 ][ERROR ][5947] Unable to manage file: Jinja syntax error: expected token ':', got '}'; line 53
第 53 行是我提出你的第二个提案的地方。
这是我正在使用的实际(已清理)行:
{% set WEBCRMKEY = salt.cmd.shell("mysql -u{{ mysql_user }} -p{{ mysql_password }} -h {{ ann_NAME|join }}.{{ full_domain }} -D ann -B -N -e \'select P from ann.USER where NAME=\"" + {{ CLIENT }} + "\"\'") %}
我想现在是时候说欢迎来到引用地狱。
@sel-fish:还有其他提示吗? (那会节省我一周的时间!)
最后一句话
最新的自私提议不错
谢谢
使用反斜杠转义单引号。
shell 命令如下:
salt.cmd.shell("mysql -uroot -ppassword -h ann -D ann -B -N -e \'select T from ann.USER where NAME=\"key\"\' 2>/dev/null; exit 0")
cmd末尾添加2>/dev/null; exit 0
,前者是为了过滤mysql命令行工具警告信息,后者是为了避免saltstack警告.
如果键是 jinja variable
,则:
salt.cmd.shell("mysql -uroot -ppassword -h ann -D ann -B -N -e \'select T from ann.USER where NAME=\"" + {{ key }} + "\"\' 2>/dev/null; exit 0")
如果要使用更多变量:
salt.cmd.shell("mysql -u" + mysql_user + " -p" + mysql_password + " -h" + ann_NAME + "." + full_domain + " -D ann -B -N -e \'select T from ann.USER where NAME=\"" + key + "\"\' 2>/dev/null; exit 0")
我正在尝试让 mysql 查询在 jinja2 "set" 语句(salt 上下文)中工作,如:
{% set KEY = salt.cmd.shell("mysql -u user -p'password' -D ann -h ann -B -N -e 'select T from ann.USER where NAME='key''") %}
我已经苦思冥想几个小时了,所以如果有人有办法实现这个,请继续!
我尝试了很多(我的意思是很多)不同的组合来完成这项工作,但我做不到。
我想到的最好的是这个 mysql 错误:
ERROR 1054 (42S22) at line 1: Unknown column 'key' in 'where clause'
我可以通过不在 "key" 周围使用简单的引号在 mysql 实例上重现,所以对我来说这确实是一个引用问题。
Jinja2 渲染器在将命令传递给 shell 之前只是删除了简单的引号,对吗?
编辑:
自私的答案起到了作用(非常感谢)但现在我意识到我需要在 "where clause" 中添加一些神社,并且(我猜)因为引用(地狱? ) jinja 变量无法解释。
有没有办法对 where 子句中的列名(键)进行正确的神社解释?
如:
salt.cmd.shell("mysql -uroot -ppassword -h ann -D ann -B -N -e \'select T from ann.USER where NAME=\"{{ key }}\"\' 2>/dev/null; exit 0")
编辑 2: 修复 jinja {{ key }} 的第二个提议失败了:
[salt.state :275 ][ERROR ][5947] Unable to manage file: Jinja syntax error: expected token ':', got '}'; line 53
第 53 行是我提出你的第二个提案的地方。
这是我正在使用的实际(已清理)行:
{% set WEBCRMKEY = salt.cmd.shell("mysql -u{{ mysql_user }} -p{{ mysql_password }} -h {{ ann_NAME|join }}.{{ full_domain }} -D ann -B -N -e \'select P from ann.USER where NAME=\"" + {{ CLIENT }} + "\"\'") %}
我想现在是时候说欢迎来到引用地狱。
@sel-fish:还有其他提示吗? (那会节省我一周的时间!)
最后一句话
最新的自私提议不错
谢谢
使用反斜杠转义单引号。
shell 命令如下:
salt.cmd.shell("mysql -uroot -ppassword -h ann -D ann -B -N -e \'select T from ann.USER where NAME=\"key\"\' 2>/dev/null; exit 0")
cmd末尾添加2>/dev/null; exit 0
,前者是为了过滤mysql命令行工具警告信息,后者是为了避免saltstack警告.
如果键是 jinja variable
,则:
salt.cmd.shell("mysql -uroot -ppassword -h ann -D ann -B -N -e \'select T from ann.USER where NAME=\"" + {{ key }} + "\"\' 2>/dev/null; exit 0")
如果要使用更多变量:
salt.cmd.shell("mysql -u" + mysql_user + " -p" + mysql_password + " -h" + ann_NAME + "." + full_domain + " -D ann -B -N -e \'select T from ann.USER where NAME=\"" + key + "\"\' 2>/dev/null; exit 0")