Обновление записей SQL на основе фрейма данных Pandas

#python #sql-server

#питон #sql-сервер

Вопрос:

Я установил соединение с SQL, используя приведенный ниже код, и извлек данные из таблицы SQL, преобразовал в dataframe и запустил прогностическую модель. У меня есть сгенерированный результат, и я хочу добавить значения только одного столбца output в базу данных на основе столбца Unique ID.

 server = 'Servername' 
database = 'DBName' 
username = 'username' 
password = 'password' 
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=' server ';DATABASE=' database ';UID=' username ';PWD='  password)

sql ='SELECT * FROM TableName'
DF= pd.read_sql(sql,cnxn)
 

У меня есть столбцы ‘UniqueID’,’Description’,’Date’,’Predicted’ в фрейме данных ‘DF’, который извлекается из базы данных. Я предсказал, что результат «Предсказан» и доступен в моем фрейме данных. Мне нужно перезаписать обратно только значение в столбце «Прогнозируемый» базы данных на основе UniqueID.

Пожалуйста, дайте мне знать, если есть какой-либо выход, или мы можем просто перезаписать полный фрейм данных в таблицу базы данных.

Ответ №1:

Лучший метод, который я нашел, — это воспользоваться внутренним соединением SQL и временными таблицами для обновления значений. Это хорошо работает, если вам нужно обновить много записей в SQL.

Прошу прощения, если здесь есть какие-либо ошибки, поскольку я заимствую это из класса, который я написал.

Курсор SQL

 cursor = cnxn.cursor()

# reduce number of calls to server on inserts
cursor.fast_executemany = True
 

Вставка значений во временную таблицу

 # insert only the key and the updated values
subset = DF[['UniqueID','Predicted']]

# form SQL insert statement
columns = ", ".join(subset.columns)
values = '(' ', '.join(['?']*len(subset.columns)) ')'

# insert
statement = "INSERT INTO #temp_TableName (" columns ") VALUES " values
insert = [tuple(x) for x in subset.values]

cursor.executemany(statement, insert)
 

Обновите значения в основной таблице из временной таблицы

 statement = '''
UPDATE
     TableName
SET
     u.Predicted
FROM
     TableName AS t
INNER JOIN 
     #temp_TableName AS u 
ON
     u.UniqueID=t.UnqiueID;
'''

cursor.execute(statement)

 

Комментарии:

1. Спасибо за ваше решение. Мне нужно добавить планировщик для запуска каждые 15 минут, в этом случае как я буду обновлять значения в основной таблице из временной таблицы через SQL

2. Описанный выше процесс обработает это за вас. В вашем случае каждые 15 минут вы будете выполнять 2 шага. Шагом 1 будет вставка «обновленных» значений во временную таблицу. На шаге 2 будет выполнена операция SQL для фактического обновления значений в основной таблице.