Чтение переменной python в запросе Oracle - sql - PullRequest
1 голос
/ 15 апреля 2020

Я хочу сохранить oracle - sql запрос в python l oop. так мало переменных python необходимо поместить в запрос sql. Ниже мой код:

import pandas as pd
import cx_Oracle
for i in range(df.shape[0]):
        a=df.iloc[i,0]
        b=df.iloc[i,1]
        c=df.iloc[i,2]
        d=df.iloc[i,3]

        con = cx_Oracle.connect('xyz', encoding='utf-8')

        SQL_query= '''SELECT q1.*,
             CASE
                WHEN start_date BETWEEN {a} AND {b} THEN '14A'
                WHEN start_date BETWEEN {c} AND {d} THEN '14B'..........'''
        pdf1 = pd.read_sql(SQL_query , con)

Как видите, a, b, c, d помещены в фигурные скобки. я хочу рассматривать его как переменную, но код принимает его как строку

1 Ответ

1 голос
/ 15 апреля 2020

Никогда не объединяйте и не интерполируйте пользовательские данные в операторы SQL. Предпочитайте использовать переменные связывания, которые помогают избежать проблем безопасности SQL Injection, потому что данные никогда не обрабатываются как часть исполняемого оператора, квалифицируясь с двоеточием (: ) для каждой переменной, например как

SQL_query  = "SELECT q1.*, "
SQL_query += " CASE "
SQL_query += " WHEN start_date BETWEEN to_date(:a,'yyyy-mm-dd') AND to_date(:b,'yyyy-mm-dd') THEN '14A' "
SQL_query += " WHEN start_date BETWEEN to_date(:c,'yyyy-mm-dd') AND to_date(:d,'yyyy-mm-dd') THEN '14B'.........."

pdf1 = pd.read_sql(SQL_query, con, params=['2020-01-01','2020-04-15','2019-01-01','2019-04-15']);

указать все четыре значения переменных в массиве params в соответствующем порядке переменных связывания a , b , c и d

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...