无法使用Template模块替换python字符串



我正在尝试使用python模板模块替换以下内容。

start_date BETWEEN DATEADD(days,-14,'${DATE_YYYY-MM-DD}') AND '${DATE_YYYY-MM-DD}'

我正在使用ConfigParser读取值并将其存储到字典(config_params(中,我成功地做到了这一点。然后我正在做一个安全的替换,以替换到上面的模板中,但它似乎没有任何作用。它替换了文件中的许多其他参数,但似乎并没有替换${DATE_YYYY-MM-DD}

我使用的代码如下:

with open(templateFile, 'r+') as f:
    temp = Template(f.read())
    resultFile = temp.safe_substitute(config_params)

为什么会发生这种情况,有什么帮助吗?它不喜欢的是((吗?

模板文件:

SELECT
x
,y
,z
,a
,b
INTO ${od}.${tab}
FROM
mphd.${pd} as h
WHERE
a BETWEEN DATEADD(month,-12,'${DATE_YYYY-MM-DD}') AND '${DATE_YYYY-MM-    DD}'
;

配置文件:

[GeneralParams]
od = sandbox
tab = abcd
pd = hierarchy_expanded
DATE_YYYY-MM-DD = 2016-08-05

config_params:

{'od': 'sandbox', 'DATE_YYYY-MM-DD': '2016-08-05', 'pd': 'hierarchy_expanded', 'tab': 'abcd'}

结果文件:

SELECT
x
,y
,z
,a
,b
INTO sandbox.abcd
FROM
mphd.hierarchy_expanded as h
WHERE
a BETWEEN DATEADD(month,-12,'${DATE_YYYY-MM-DD}') AND '${DATE_YYYY-MM- DD}'
;

根据文档,标识符应该遵循的默认模式是:[_a-z][_a-z0-9]*。使用substitute而不是safe_substitute会对此发出警告。

但是,您可以通过创建一个新的模板类来解决这个问题:

class MyTemplate(Template):
    idpattern = '[_a-z][_a-z0-9-]*' # Note the extra -

然后我们在您的代码中使用MyTemplate(或您想命名的任何名称(,而不是Template(。

最新更新