2016-06-14 3 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

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

Как я могу выполнить переменную подстанцию ​​в .py файл из другого файла .py

+0

делая это с помощью простых строковых замен оставит вас открыты для случайного или злонамеренного ** SQL Injection **. Вместо этого используйте библиотеку, такую ​​как 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 будет проверена перед исполнением. im lookinh для простого решения замены varisble. sql alchemy не работает с базами данных, с которыми я работаю с – 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, специфичной для вашего сервера.

РЕДАКТИРОВАТЬ:

Модуль Python является объектом и каждая переменная определена таким модулем является атрибутом. Информация об атрибутах объекта python хранится в пространстве имен объектов (__dict__). По умолчанию пустой модуль имеет следующие атрибуты:

  • __builtins__
  • __file__
  • __name__
  • __doc__

Эти специальные атрибуты оставлены в стороне благодаря условию (if '__' not in k)

+0

hi..i пытаюсь прочитать данные с определенными параметрами, поэтому SQL-инъекция здесь не является проблемой.в этом случае exec_sql_file генерируется из файла parms и файла rawsql? Я хочу посмотреть, как я могу сгенерировать exec_sql_file из файла params и файла rawsql (файл с параметрами) – pmv

+0

где находится файл params. Я сделал chanes для файла param в той же папке, что и ipython notebook. но они не применяются – pmv

+0

в моей настройке, все файлы находятся в одной папке. Вы пытались выполнить файл непосредственно с терминала? Потому что ноутбук может запускать его из другой папки – kardaj

0

Mayb Попробуй что-нибудь подобное? Вместо этого верните 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()