2009-08-25 11 views
1

Я пишу скрипт python, который будет обрабатывать текстовые файлы. В рамках этого процесса мне нужно импортировать каждую строку файла с разделителями табуляции в локальную таблицу MS SQL Server (2008). Я использую pyodbc, и я знаю, как это сделать. Тем не менее, у меня есть вопрос о наилучшем способе его выполнения.Импорт текстового файла в SQL Server в Python

Я буду перебирать файл, создавая для каждой строки файла курсор.execute (myInsertSQL). Кто-нибудь видит какие-либо проблемы, ожидающие фиксации операторов до тех пор, пока все записи не будут зациклированы (т. Е. Выполните commit() после цикла, а не внутри цикла после каждого отдельного выполнения)? Причина, по которой я спрашиваю, состоит в том, что некоторые файлы будут иметь более 5000 строк. Я не знал, попытается ли «спасти их», и все 5000 сразу же вызовут проблемы.

Я довольно новичок в python, поэтому пока не знаю всех этих проблем.

Спасибо.

+0

«Я не знал, пытается ли« сохранить их », и совершение всех 5000 сразу вызовет проблемы». Какие «проблемы» вы себе представляете? Ты это пробовал? Что он сделал? Перемещение фиксации из цикла в конец цикла является таким тривиальным изменением, что вы можете легко сделать и то и другое, что вы узнали. –

+0

Я пробовал его с меньшими наборами и не испытывал проблем. Меня беспокоило не то, что это не сработает, когда я буду тестировать, но, возможно, если бы был какой-то потолок, за которым я должен был следить. Файлы будут различаться по размеру и могут превышать 5000. Сценарий, который я пишу, будет запускаться как часть пакетного планирования в производство, и я просто пытаюсь обеспечить, чтобы я не сталкивался с проблемами, делая что-то, что не является рекомендуемые. –

+0

Предоставляет ли интерфейс python sqlserver метод '.executemany'? –

ответ

0

Если я понимаю, что вы делаете, Python не будет проблемой. Выполнение оператора внутри транзакции не создает кумулятивное состояние в Python. Он будет делать это только на сервере базы данных.

Когда вы совершаете фиксацию, вам необходимо убедиться, что произошла фиксация, поскольку наличие большого пакетного коммита может противоречить промежуточным изменениям в базе данных. Если коммит не удался, вам придется снова запустить пакет.

Это единственная проблема, что я в курсе с большими партиями и Python/ODBC (и это даже не на самом деле проблема Python, так как вы бы эту проблему независимо.)

Теперь, если вы создаете все SQL в памяти, а затем цикл через представление памяти, что может иметь больше смысла. Тем не менее, 5000 строк текста на современной машине действительно не так уж и важны. Если вы начнете обрабатывать два порядка больше, вам может потребоваться переосмыслить ваш процесс.

+0

Спасибо за понимание. Я думаю, что эта информация, в сочетании с вышеупомянутой идеей, будет тем, о чем мне нужно подумать. –

0

Создайте файл и используйте BULK INSER T. Это будет быстрее.

+0

Я раньше не использовал BULK INSERT, но это стоит посмотреть. Поскольку я должен буду сделать этот скрипт завтра, я возьму на себя первый подход и перейду к BULK INSERT, когда у меня будет больше времени. Благодарю. –

+0

BULK INSERT может потребовать дополнительных прав в базе данных. Я знаю, что я должен был попросить у них администратора sys. – tgray