Время прочтения: 2 мин.
Передо мной стояла задача импортировать на сервер около 100 файлов. Использовать стандартный мастер экспорта/импорта крайне неудобно. Поэтому мы хотели импортировать на сервер через CMD, при этом видеть статус обработки по каждому из 100 файлов csv – получать отчет об успешной загрузке или неуспешной.
Для достижения этой цели выбраны следующие инструменты:
- Язык программирования Python. С его помощью мы автоматизируем работу с командной строкой Windows CMD – будем запускать поочередно загрузку файла на сервер СУБД и вести лог отчетов об успешном выполнении или нет.
- 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 на сервере.
Результатом программы является автоматизация загрузки множества файлов на сервер СУБД.