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)