#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 для фактического обновления значений в основной таблице.