Update, если ячейка уже есть в базе

Работаю с MS SQL, на данный момент разобрался как переносить в базу из экселя без прописывания циклов. Однако, код подразумевает только добавление ячеек, хочу их обновлять, если значение (например, идентификатор) уже есть в базе, как это можно реализовать? Думал над сравнением датафреймов (экселя и базы) и нахождением соответствий в колонке, но может есть способ попроще? Код на данный момент:

import pandas as pd
from sqlalchemy import create_engine

server = "servername"
dbname = "name"

eng = create_engine("mssql+pyodbc://"+server+"/"+dbname+"?driver=SQL+Server")
xlsx.to_sql("Obrabotchik", eng, if_exists="append", index = False)

Смотрел как человек делал на PL SQL, но не разобрался с кодом запроса, на MS SQL вроде как подменяется "%s" на "?". Что с инсертом, что с апдейтом либо ошибка при добавлении (неверный формат), либо ничего не добавляет и ничего не обновляет. Сам ролик тут: https://www.youtube.com/watch?v=77IVf0zgmwI&list=LL&index=4&t Код из него:

import pyodbc
import pandas as pd
server = 'servername'
database = 'name'
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database)
cursor = cnxn.cursor()
print("первая проверка")
xlsx = pd.read_excel("1.xlsx")


def check_if_ID_exists(cursor, ID_obr):
    query = ("""select ID_obr FROM Obrabotchik where ID_obr = ?""")
    cursor.execute(query, (ID_obr, ))

    return cursor.fetchone() is not None


def update_row(cursor, ID_obr, A1, A2):
    query = ("""update Obrabotchik
                set A1 = ?,
                A2 = ?
                where ID_obr = ?""")
    vars_to_update = (A1, A2, ID_obr)
    cursor.execute(query, vars_to_update)


def update_db(cursor, xlsx):
    tmp_xlsx = pd.DataFrame(columns= ['ID_obr','A1','A2'])

    for i, row in xlsx.iterrows():
        if check_if_ID_exists(cursor, row ['ID_obr']):
            update_row(cursor, row['ID_obr'], row['A1'], row['A2'])
        else:
            tmp_xlsx = tmp_xlsx.append(row)
    return tmp_xlsx


def insert_into_table(cursor, ID_obr, A1, A2):
    insert_into_id = ("""insert into Obrabotchik (ID_obr, A1, A2) values (?, ?, ?)""")
    row_to_insert = (ID_obr, A1, A2)
    cursor.execute(insert_into_id, row_to_insert)

def append_from_xlsx_to_db(cursor, xlsx):
    for i, row in xlsx.iterrows():
        insert_into_table(cursor, row['ID_obr'], row['A1'], row['A2'])


new_id_obr = update_db(cursor, xlsx)
f = append_from_xlsx_to_db(cursor, new_id_obr)
print(f)

Ответы (0 шт):