Как отформатировать запрос на слияние SQL Server 2017 внутри цикла for для заполнения переменных запроса из столбцов pandas df - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь динамически создать инструкцию SQL Server EXECUTE для повторного использования в процессах таблиц ETL. Таким образом, необходимое количество строковых переменных зависит от файла SQL, переданного в переменную query. Вот один из них:

execute mergeTable1
  @param1 = '{}',
  @param2 = '{}',
  @param3 = '{}',
  @param4 = '{}',
  @param5 = '{}',
  @param6 = '{}',
  @param7 = '{}',
  @param8 = '{}',
  @param9 = '{}'

Я выполняю хранимую процедуру для каждой строки в кадре данных pandas. Когда я создал эту функцию «execute», я создал ее для одного табличного процесса.

Вот оригинальный рабочий код:

def mergeTable1(self, query, df) :
  for index, row in df.iterrows() :
    retryFlag = True
    retryCount = 0

    while retryFlag and retryCount < 5 :
      try :
        self.cur.execute(query.format(row['column1'], row['column2'], row['column3'], ...))
        retryFlag = False
      except Exception as error :
        print('error executing query "{}", error: {}'.format(query, error))
        retryCount = retryCount + 1
        time.sleep(1)

self.cxn.commit()

Я все еще новичок в этом (впервые провожу более чем несколько дней, учась), так что я мог что-то упустить в том, чтоЯ уже пробовал.

Тем не менее, большая часть того, что я могу найти, это больше об операторах вставки с определенными именами столбцов. Это, вероятно, часть [row()], которая сбивает меня с толку. Можно ли (не ненавижу) делать что-то, что я могу использовать для любого запроса SQL EXECUTE? Может быть, что-то вроде этого ...

def execute(self, query, df) :
  for column in df :
    # query.format(row['column1'], row['column2'], row['column3'], ...)

  for index, row in df.iterrows() :
    retryFlag = True
    retryCount = 0

    while retryFlag and retryCount < 5 :
      try :
        self.cur.execute(query)
        retryFlag = False
      except Exception as error :
        print('error executing query "{}", error: {}'.format(query, error))
        retryCount = retryCount + 1
        time.sleep(1)

self.cxn.commit()

Извините еще раз, если я что-то упускаю тривиально. Можно подумать, что это была пятница с тем, как размыта моя голова сейчас!

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