我有一个包含所有参数值的参数文件。 我想将这些值传递给另一个.py(原始sql文件)并生成一个可执行的sql文件这是我到目前为止所拥有的
params.py 文件
var1 = '1,2,3'
var2 = '('abc', 'cde', 'xyz')'
rawsql.py
import params
select *
from emp.ids
where ids in var1
and names in var2
我期望的输出是一个.sql文件
exec_sql_file.sql
select *
from emp.ids
where ids in (1,2,3) and
and names in ('abc','code','xyz')
如何从另一个.py文件中完成.py文件中的可变变电站
以下代码片段将为您提供需要做什么的想法:
import params
# filter non built-in variable names
variables = [k for k in params.__dict__ if '__' not in k]
with open('rawsql.sql', 'r') as f:
content = f.read()
for v in variables:
content = content.replace(v, getattr(params, v))
with open('exec_sql_file.sql', 'w') as f:
f.write(content)
当然,这不是万无一失的,可以改进以满足您在字符串格式方面的需求。我还应该强调,这样做会让你打开SQL注入,你可能应该使用基于sqlalchemy
的解决方案或特定于你的服务器的另一个库。
编辑:
python模块是一个对象,在这样的模块中定义的每个变量都是一个属性。有关 python 对象属性的信息存储在对象命名空间(其__dict__
)中。默认情况下,空模块具有以下属性:
-
__builtins__
-
__file__
-
__name__
-
__doc__
由于条件(if '__' not in k)
,这些特殊属性被搁置一旁
也许尝试这样的事情?而是返回 sql 写入文件。
params.py 文件
def var1():
return = '1,2,3'
def var2():
return '('abc', 'cde', 'xyz')'
rawsql.py
import params
def sqlCont():
return "select * from emp.ids where ids in '%s' and names in '%s' " % (params.var1, params.var2 )
if __name__ == '__main__':
sqlCont()