Pyodb c - SQL Инъекция в Упсерт - PullRequest
1 голос
/ 12 февраля 2020

я использовал? заполнитель для передачи списка значений в Python для вставки / обновления.

Теперь я пытаюсь закрепить записи с помощью этого ответа

Код:

table_name = 'ddf.ddf_actuals'

columns_list = df.columns.tolist()
columns_list_query = f'({(",".join(columns_list))})'
sr_columns_list = [f'Source.{i}' for i in columns_list]
sr_columns_list_query = f'({(",".join(sr_columns_list))})'
up_columns_list = [f'{i}=Source.{i}' for i in columns_list]
up_columns_list_query = f'{",".join(up_columns_list)}'

rows_to_insert = [row.tolist() for idx, row in final_list.iterrows()]
rows_to_insert = str(rows_to_insert).replace('[', '(').replace(']', ')')[1:][:-1]


query = f"MERGE INTO {table_name} as Target \
USING (SELECT * FROM \
(VALUES {rows_to_insert}) \
AS s {columns_list_query}\
) AS Source \
ON Target.stationcode=Source.stationcode AND Target.date=Source.date \
WHEN NOT MATCHED THEN \
INSERT {columns_list_query} VALUES {sr_columns_list_query} \
WHEN MATCHED THEN \
UPDATE SET {up_columns_list_query};"
c.execute(query)

c.commit()

Проблема rows_to_insert имеет строковые значения в одинарных кавычках. Я пытался заменить одинарную кавычку на \', но не сработал, как ожидалось. Поскольку \' является escape-последовательностью для Python, а не для SQL, не сработало. Даже замена на '' не сработала

Так как я выполняю список, не знаю, как здесь можно использовать заполнитель ?

...