Zoals opgemerkt in een opmerking bij een ander antwoord, is de T-SQL BULK INSERT
opdracht werkt alleen als het te importeren bestand zich op dezelfde computer bevindt als de SQL Server-instantie of zich op een SMB/CIFS-netwerklocatie bevindt die de SQL Server-instantie kan lezen. Het is dus mogelijk niet van toepassing in het geval dat het bronbestand zich op een externe client bevindt.
pyodbc 4.0.19 heeft een Cursor#fast_executemany-functie toegevoegd die in dat geval nuttig kan zijn. fast_executemany
is standaard "uit" en de volgende testcode ...
cnxn = pyodbc.connect(conn_str, autocommit=True)
crsr = cnxn.cursor()
crsr.execute("TRUNCATE TABLE fast_executemany_test")
sql = "INSERT INTO fast_executemany_test (txtcol) VALUES (?)"
params = [(f'txt{i:06d}',) for i in range(1000)]
t0 = time.time()
crsr.executemany(sql, params)
print(f'{time.time() - t0:.1f} seconds')
... duurde ongeveer 22 seconden om uit te voeren op mijn testmachine. Gewoon crsr.fast_executemany = True
. toevoegen ...
cnxn = pyodbc.connect(conn_str, autocommit=True)
crsr = cnxn.cursor()
crsr.execute("TRUNCATE TABLE fast_executemany_test")
crsr.fast_executemany = True # new in pyodbc 4.0.19
sql = "INSERT INTO fast_executemany_test (txtcol) VALUES (?)"
params = [(f'txt{i:06d}',) for i in range(1000)]
t0 = time.time()
crsr.executemany(sql, params)
print(f'{time.time() - t0:.1f} seconds')
... de uitvoeringstijd teruggebracht tot iets meer dan 1 seconde.