Как использовать переменные в запросе SQL при использовании Python и pyodbc - PullRequest
0 голосов
/ 07 мая 2018

Я использую Python для извлечения данных из SQL с помощью ODBC для связи Python с базой данных SQL. когда я делаю запрос, мне нужно использовать переменные в запросе, чтобы сделать мой результат запроса изменяемым. Например, мой код:

import pyodbc
myConnect = pyodbc.connect('DSN=B1P HANA;UID=***;PWD=***')
myCursor = myConnect.cursor()
Start = 20180501
End = 20180501
myOffice = pd.Series([1,2,3])
myRow = myCursor.execute("""
                         SELECT "CALDAY" AS "Date",
                                "/BIC/ZSALE_OFF" AS "Office"
                         FROM "SAPB1P"."/BIC/AZ_RT_A212"
                         WHERE "CALDAY" BETWEEN 20180501 AND 20180501
                         GROUP BY "CALDAY","/BIC/ZSALE_OFF" 
                         """)
Result = myRow.fetchall()
d = pd.DataFrame(columns=['Date','Office'])
for i in Result:
  d= d.append({'Date': i.Date,
               'Office': i.Office},
               ignore_index=True)

Вы видите, что я извлекаю данные из базы данных SQL и сохраняю их в виде списка (Результат), а затем преобразовываю этот список во фрейм данных (d).

Но мои проблемы:

  1. Мне нужно указать дату начала и конец данных в части myCursor.execute, что-то вроде "CALDAY" BETWEEN Start AND End
  2. Допустим, у меня 100 данных в моих данных. Теперь мне просто нужно 3 из них (myOffice). Итак, мне нужно поместить условие в часть myCursor.execute, например myOffice in (1,2,3)

В R я знаю, как справиться с этими двумя проблемами. код такой:

office_clause = ""
if (myOffice != 0) {
  office_clause = paste(
    'AND "/BIC/ZSALE_OFF" IN (',paste(myOffice, collapse=", "),')'
  )
}
a <- sqlQuery(ch,paste(' SELECT ***
                         FROM ***
                         WHERE "CALDAY" BETWEEN',Start,'AND',End,'
                               ',office_clause1,'
                         GROUP BY ***
                       '))

Но я не знаю, как это сделать в Python. Может ли кто-нибудь помочь мне здесь?

1 Ответ

0 голосов
/ 07 мая 2018

Для этого вы можете использовать операции форматирования строки .

Первое определение

query = """
SELECT 
    "CALDAY" AS "Date",
    "/BIC/ZSALE_OFF" AS "Office"
FROM 
    "SAPB1P"."/BIC/AZ_RT_A212"
WHERE 
    "CALDAY" BETWEEN {start} AND {end}
    {other_conds}
GROUP BY 
    "CALDAY","/BIC/ZSALE_OFF" 
"""

Теперь вы можете использовать

myRow = myCursor.execute(query.format(
    start='20180501'
    end='20180501',
    other_conds=''))

и

myRow = myCursor.execute(query.format(
    start='20180501'
    end='20180501',
    other_conds='AND myOffice IN (1,2,3)'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...