2016-06-14 20 views
0

すべてのパラメータ値を持つパラメータファイルがあります。私は別の.py(生のSQLファイル)にこれらの値を渡すと、実行可能SQLファイルここ を生成したいのは、私がこれまで持っているものであるパラメータ.pyファイルから別の.pyファイルへの置換

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

です210
select * 
from emp.ids 
where ids in (1,2,3) and 
and names in ('abc','code','xyz') 

どのように私は別の.pyファイルからの.pyファイル内の変数変電所を達成することができます

+0

**は偶発的または悪意のある** SQLインジェクションに開いてあなたを残します。代わりにSQLAlchemyなどのライブラリを使用するか、このhttp://stackoverflow.com/questions/1633332/how-to-put-parameterized-sql-query-into-variable-and-then-executeをご覧ください-in-python – slezica

+0

jinja http://jinja.pocoo.org/ – user590028

+0

のような良いテンプレートソリューションを使用する方が良いかもしれないようですが、実行前にsql文字列が検証されます。単純な揮発性交換ソリューションのための私のlookinh。 SQLの錬金術は、私は – pmv

答えて

0

次のスニペットは、あなたとあなたが何をする必要があるかのアイデアを与えるだろう。もちろん

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またはあなたのサーバーに固有の別のlibに基づいたソリューションを用意してください。

EDIT:

Pythonモジュールオブジェクトであり、そのようなモジュールで定義されたすべての変数が属性です。 Pythonオブジェクトの属性に関する情報は、オブジェクトの名前空間(__dict__)に格納されます。これらの特別な属性が条件(if '__' not in k)

+0

と働いているデータベースで動作しませんhi..i特定のパラメータでデータを読み取ろうとしていますので、SQLの注入はここでは問題になりません。この場合、exec_sql_fileはparmsファイルとrawsqlファイルから生成されますか?私はparamsファイルとrawsqlファイル(parametrizedファイル) – pmv

+0

からexec_sql_fileをどのように生成できるのかを見たいところです。どこにあるparamsファイルがありますか?私はipythonのノートブックと同じフォルダにparamファイルにchanesを作った。しかし、これらは私のセットアップで – pmv

+0

に適用されません、すべてのファイルは同じフォルダにあります。ターミナルから直接ファイルを実行しようとしましたか?ノートブックが別のフォルダからそれを実行している可能性があるので、 – kardaj

0
に感謝を脇に残っている

  • __builtins__
  • __file__
  • __name__
  • __doc__

:デフォルトでは、空のモジュールは、以下の属性があります

メイブこのようなことを試してみませんか?代わりに、sql writeをfileに戻してください。単純な文字列の置換でこれをやって

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()  
関連する問題