У меня есть фрейм данных, с помощью которого я хочу обновить или вставить таблицу в SQL Server.Мои данные выглядят следующим образом.Данные содержат около 95 тыс. Строк.
ДАННЫЕ НИЖЕ:
data =
ContactabilityScore DayofTheWeek CallBlockStartTime CallBlockEndTime \
0 0 Monday 8 9
1 1 Tuesday 8 9
2 1 Wednesday 8 9
3 0 Thursday 8 9
4 0 Friday 8 9
5 2 Monday 8 9
6 8 Tuesday 8 9
7 3 Wednesday 8 9
8 4 Thursday 8 9
9 0 Friday 8 9
Season LoadDate ContactId TimeZone BatchNumber AccountId
0 Fall 2018-09-24 1-1008KJJ Pacific Time Zone 24092018 1-1008KK9
1 Fall 2018-09-24 1-1008KJJ Pacific Time Zone 24092018 1-1008KK9
2 Fall 2018-09-24 1-1008KJJ Pacific Time Zone 24092018 1-1008KK9
3 Fall 2018-09-24 1-1008KJJ Pacific Time Zone 24092018 1-1008KK9
4 Fall 2018-09-24 1-1008KJJ Pacific Time Zone 24092018 1-1008KK9
5 Fall 2018-09-24 1-100AROM Eastern Time Zone 24092018 1-100AROS
6 Fall 2018-09-24 1-100AROM Eastern Time Zone 24092018 1-100AROS
7 Fall 2018-09-24 1-100AROM Eastern Time Zone 24092018 1-100AROS
8 Fall 2018-09-24 1-100AROM Eastern Time Zone 24092018 1-100AROS
9 Fall 2018-09-24 1-100AROM Eastern Time Zone 24092018 1-100AROS
У меня есть промежуточная таблица в SQL Server, где может существовать ContactId
.Таким образом, если это ContactId
существует, то UPDATE
ContactabilityScore
, если нет, INSERT
строка фрейма данных.Ниже моя попытка, и я не уверен, является ли это правильным способом.
КОД НИЖЕ:
conn = connection('insert')
curr = conn.cursor()
curr.fast_executemany=True
print("\nScorig process began at %s" %(str(datetime.datetime.now())))
print("Starting Insert of %s rows" %(len(data)))
SQL_UPDATE = """UPDATE [dbo].[STG_TABLE]
SET [ContactabilityScore]=?, [LoadDate]=?
WHERE [ContactId]=? AND [CallBlockStartTime]=?
AND [CallBlockEndTime]=? AND [DayofTheWeek]=? AND [Season]=?"""
SQL_INSERT = "INSERT INTO [dbo].[STG_TABLE] VALUES (?" + ",?"*(data.shape[1]-1) + ")"
res = curr.executemany(SQL_UPDATE, tuple(map(list, data[['ContactabilityScore', 'LoadDate', 'ContactId','CallBlockStartTime'
,'CallBlockEndTime','DayofTheWeek','Season']].values)))
if res.rowcount==0:
curr.executemany(SQL_INSERT, tuple(map(list, data.values)))
Я не уверен,это сделает UPSERT
правильно.Какой правильный способ сделать это, если я не хочу перебирать каждую строку фрейма данных и отрабатывать весь фрейм данных.Я очень ценю вашу помощь.