2个选项。在
配置解析器
我将使用旧的INI/ConfigParser格式。以前经常使用它们,但现在更倾向于json,只是json对于sql来说不是很好。在
这是Pythonimport ConfigParser
cfp = ConfigParser.ConfigParser()
cfp.read("test_so08.ini")
myselect = cfp.get("sql", "select", raw=True)
for line in myselect.split("\n"):
print ":%s:" % (line)
还有ini。请注意,您需要在select=之后的每一行中至少缩进一个空白,否则configparser将尝试解析其他行,而不是使用select将它们分组。在
^{pr2}$
打印出来::select *:
:from customers:
:where custid = %(custid)s:
优点:它不是一个代码文件,所以理论上你可以让任何人配置sql。理论上。在
缺点:基于ini的sql在获取变量方面有相当大的开销,而且当你想添加更多的特性时,你会做很多的变通。在
模块中的普通旧三元组字符串变量
另一种选择是只使用Python模块并使用三重引号字符串。我倾向于把它用于sql,而不是ini。在
优点:简单。
缺点:只有Python和无效的语法错误会停止调用脚本。在say this is sql_test_so08.py
select = """
select *
from customers
where custid = %(custid)s
"""
select2 = """"""
在你的剧本中:import sql_test_so08
print sql_test_so08.select
一个优点是,我可以使用Template/$var替换来替换从其他地方导入的应用程序常量,而不是在sql中硬编码它们。假设您将一个无效的“客户”未付款标志设置为3。在
在sql.py您想要的文件:from constants import invalid_customer_unpaid
di_constants = dict(invalid_customer_unpaid=invalid_customer_unpaid)
select_bad="""select... where ... $invalid_customer_unpaid"""
select_bad = Template(select_bad).substitute(di_constants)
注意:我很少使用直接变量替换,如下所示。SQL注入的风险太大。但是您可以使用RDBMS的绑定参数支持应用相同的思想。在
编辑:
现在做了很多山药。
-JSON用于机器写入和机器读取。
-YAML用于手写、机器读取,因为它在支持引号和格式方面比JSON要好得多。在
给予测试.yaml:sql:
select: select * from customers where custid = %(custid)s
text: 'some text with ''abc'' and "xyz" '
那么from yaml import safe_load as yload
with open("test.yaml") as fi:
di2 = yload(fi)
print (di2["sql"]["select"])
将输出:select * from customers where custid = %(custid)s