Первый вопрос достаточно прост для решения.У вас есть многострочная строка, заключенная только в одинарные кавычки:
cursorsource.execute('SELECT sp_no, sp_name, sp_territory, sp_product,
active FROM testarea.salepersons_original;')
Вы должны заключить ее в тройные кавычки, что не повлияет на выполнение SQL:
cursorsource.execute("""SELECT sp_no, sp_name, sp_territory, sp_product,
active FROM testarea.salepersons_original;""")
Оставшийся кодМне трудно следовать.Я сомневаюсь, что на самом деле у вас есть таблица с 5000 столбцами, поэтому я думаю, что вы пытаетесь сделать 1000 вставок строк, содержащих 5 значений.Я могу дать общий подход к этому, только если мое понимание верно:
import random
import string
# Create some fake data to visualise
fake_data = [random.choice(list(string.ascii_letters)) for x in range(50)]
# Chunk the data (https://stackoverflow.com/a/1751478/4799172)
# This reshapes it into sublists each of length 5.
# This can fail if your original list is not a multiple of 5, but I think your
# existing code will still throw the same issues.
def chunks(l, n):
n = max(1, n)
return (l[i:i+n] for i in range(0, len(l), n))
chunked_data = chunks(fake_data, 5)
sql_insert = """INSERT INTO testarea.salepersons_2 (sp_no, sp_name,
sp_territory, sp_product, active) values (?, ?, ?, ?, ?)"""
# Use executemany, not execute in a loop, to repeat for each sublist in
# chunked_data
cursor.executemany(sql_insert, chunked_data)
Обратите внимание, что в этом случае я использую параметризованный запрос для защиты от внедрения SQL (я использую ?
как заполнители для значений).Разные библиотеки имеют разные заполнители;например, оболочки MySQL ожидают %s
, в то время как SQLite ожидает ?
- в этом случае я использовал ?
, чтобы устранить неоднозначность, что это не просто обычное форматирование строки, но вам, возможно, придется вернуться обратно к %s
.