Для массовой вставки строк лучше использовать executemany, а не делать execute в цикле.
https://dev.mysql.com/doc/connector-python/en/conn...
Т.е. сформировать вложенный список строк, затем массово его вставить, например так:
# формируем вложенный список всех строк данных
data = [[
sheet[f'A{i}'].value, #id
sheet[f'B{i}'].value, #имя
sheet[f'C{i}'].value, #фамилия
sheet[f'D{i}'].value, #отчество
sheet[f'E{i}'].value, #Водительские права(Есть/Нет)
sheet[f'F{i}'].value, #Семейное положение(Да/Нет)
sheet[f'G{i}'].value] #Профессия
for i in range (2, 500002)
]
# массово вставляем все данные
cursor.executemany("""insert into table1(id, name, fam, otch, vod_pr, sem_pol, prof)
values(%s, %s, %s, %s, %s, %s, %s)""", data)
Но раз уж мы массово вытаскиваем данные, то лучше переделать выборку, например так:
# формируем вложенный список всех строк данных (тут подставить свои значения min/max row/column если потребуется)
data = list(sheet.iter_rows(min_row=2, max_row=500002, max_col=7, values_only=True))
# массово вставляем все данные
cursor.executemany("""insert into table1(id, name, fam, otch, vod_pr, sem_pol, prof)
values(%s, %s, %s, %s, %s, %s, %s)""", data)
Хотя возможно есть более быстрый способ массово выбирать данные строк в openpyxl, я не знаю.
P.S. можно сразу почистить данные от пустых строк, например так
data = list(filter(lambda x: any(x), data))