Время прочтения: 2 мин.

Передо мной стояла задача импортировать на сервер около 100 файлов. Использовать стандартный мастер экспорта/импорта крайне неудобно. Поэтому мы хотели импортировать на сервер через CMD, при этом видеть статус обработки по каждому из 100 файлов csv – получать отчет об успешной загрузке или неуспешной.

Для достижения этой цели выбраны следующие инструменты:

  1. Язык программирования Python. С его помощью мы автоматизируем работу с командной строкой Windows CMD – будем запускать поочередно загрузку файла на сервер СУБД и вести лог отчетов об успешном выполнении или нет.
  2. CMD + Bulk Copy Program для загрузки каждого отдельного файла.

Приведём пример кода:

#Импорт необходимых библиотек:
import glob
import os
import datetime as dt
#Код нашей программы:
# каталог, где распаложены файлы
csv_str = glob.glob(r"C:\Users\Documents\*.csv")
# генерирование строчки для командной строки
bcp = r'bcp [SANDBOX].[aaa].[bbb] in "{0}" -T -F2 -c -S server -t"~" -C ACP -k '
n = 1
# Время начала загрузки
start = dt.datetime.now() 
print('\nВремя начала загрузки: ' + str(start))
for csv in csv_str:
print('\nФайл ' + csv + ' ' + str(n) + ' из ' + str(len(csv_str)) + ' ' + str(dt.datetime.now()))
# Запуск командной строки
stream = os.popen(bcp.format(csv)) 
# Чтение командной строки
output = stream.read()                   

Например, вот как будет выглядеть текст ошибки, если файла не будет в каталоге.

Error = [Microsoft][ODBC Driver 13 for SQL Server]ЌҐ г¤ Ґвбп ®вЄалвм д ©« ¤ ­­ле BCP ­  бҐаўҐаҐ.

Чтобы правильно, прочитать ошибку нужно сначала возвратить кодированную версию строки, а затем перекодировать её. Это можно сделать с помощью следующей строки:

output.encode('cp1251').decode('cp866')

Теперь мы можем прочитать нашу ошибку, и уже использовать текст для обработки исключений:

Error = [Microsoft][ODBC Driver 13 for SQL Server]Не удается открыть файл данных BCP на сервере.

Результатом программы является автоматизация загрузки множества файлов на сервер СУБД.