Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 17, 2019 12:40:50

vitk
Зарегистрирован: 2019-08-30
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Импорт SQL патчей с помощью цикла

Друзья помогите написать правильно цикл !
Есть список патчей SQL

 service_pack_folder = D:\python\smscripts\t7\servicepack
 c = 'patch0001.sql', 'patch0002.sql', 'patch0003.sql', 'patch0004.sql'
Я выполняю импорт этих файлов через цикл с помощью sqlcmd
  for file_list_import in c:
        print("Executing Patch: " + file_list_import + " Now")
        sql_cmd = ['sqlcmd', '-I', '-b', '-V', '10', '-S', server, '-d', database, '-U', username, '-P', password, '-i', 
        service_pack_folder + "/" + file_list_import]
        process = subprocess.run(sql_cmd, encoding="utf-8")

Как мне сделать так что бы при импорте каждого патча записывался и апдейт в таблицу
Тоесть когда сделалася импорт patch0001.sql записалось имя файла в таблицу что он импортнулся и так дальше patch0002.sql, но если например patch0003.sql завершился ошибкой то и запись в таблицу не пошла

Делать апдейт таблицы например так
tsql = "UPDATE PatchNumber SET LatestPatchNumber = ?, Date = ? WHERE Id = 3;"
with cursor.execute(tsql, latest_patch, formatted_date):
print ('Successfully Updated Patch Table!')

Как сделать так цикл что бы после каждого элемента из списка делалась еще одна комманда, а не после всего списка из листа

Отредактировано vitk (Ноя. 17, 2019 13:13:57)

Офлайн

#2 Ноя. 17, 2019 15:51:48

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Импорт SQL патчей с помощью цикла

 import subprocess
 
code = subprocess.call("notepad.exe")
if code == 0:
    print("Success!")
else:
    print("Error!")
а так то в стандартной библиотеке есть модуль для работы с sql >>



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#3 Ноя. 17, 2019 16:51:49

vitk
Зарегистрирован: 2019-08-30
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Импорт SQL патчей с помощью цикла

AD0DE412
Спасибо уже делаю с проверкой на 0

Еще один вопрос, есть возможность из цикла указать на каком именно файле при выполнении произошел сбой, тоесть вевести название файла в переменную ??

 file_list_import= 'patch0001.sql', 'patch0002.sql', 'patch0003.sql', 'patch0004.sql'
sql_cmd = ['sqlcmd', '-I', '-b', '-V', '10', '-S', server, '-d', database, '-U', username, '-P', password, '-i', 
service_pack_folder + "/" + file_list_import]
code = subprocess.call(sql_cmd, encoding="utf-8")
if code == 0:
    print("Success!")
else:
    print("Error!")

Как узнать на каком файле произошел
 else:
    print("Error!")

Отредактировано vitk (Ноя. 17, 2019 16:52:13)

Офлайн

#4 Ноя. 17, 2019 19:46:52

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Импорт SQL патчей с помощью цикла

ну такое …

 file_list_import= ['patch0001.sql',
                    'patch0002.sql', 
                    'patch0003.sql', 
                    'patch0004.sql']
sql_cmd = ['sqlcmd', 
            '-I', 
            '-b', 
            '-V', 
            '10', 
            '-S', 
            server, 
            '-d', 
            database, 
            '-U', 
            username, 
            '-P', 
            password, 
            '-i', 
            service_pack_folder]
for i in file_list_import:
    code = subprocess.call(sql_cmd + ["/" + i] , encoding="utf-8")
    if code == 0:
        print("Success!")
    else:
        print("Error!")
… гипотетически
зы хз как то “велосипедом” выглядит может все же модулем попробуете?



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#5 Ноя. 18, 2019 10:54:33

vitk
Зарегистрирован: 2019-08-30
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Импорт SQL патчей с помощью цикла

AD0DE412
ну такое …
Спасибо что помагаете !

Я не пойму как мне сделать модулем, то что я сейчас пытаюсь сделать, Можете пример показать какойто ?

Офлайн

#6 Ноя. 18, 2019 11:45:58

vitk
Зарегистрирован: 2019-08-30
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Импорт SQL патчей с помощью цикла

vitk

Похоже все получилось у меня, спасибо за помощь еще раз вот мой скрипт

 import pyodbc
import datetime
import configparser
import os
import time
from threading import Thread
import subprocess
config = configparser.ConfigParser()
config.read('test_py.ini')
database = config["DATABASE_PY"]["database"]
username = config["DATABASE_PY"]["username"]
password = config["DATABASE_PY"]["password"]
server = config["DATABASE_PY"]["server"]
service_pack_folder = config["FLDER_PATCH"]["service_pack_dir"]
cnxn_SiteConfigDB = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn_SiteConfigDB.cursor()
date = datetime.datetime.now()
formatted_date = date.strftime('%Y-%m-%d %H:%M:%S')
print(formatted_date)
print('All patches in directory')
file_list = os.listdir(service_pack_folder)
def last_4chars(x):
    return(x[-4:])
sorted(file_list, key = last_4chars)
print(file_list)
latest_patch = file_list.pop()
print('Show latest patch number in folder')
#file_patch_number = (latest_patch.translate({ord(i): None for i in 'patch.sql'}))
#print(file_patch_number)
print(latest_patch)
tsql2 = "SELECT TOP 1 LatestPatchNumber FROM PatchNumber ORDER BY LatestPatchNumber DESC;"
with cursor.execute(tsql2):
    MaxNum, = cursor.fetchone()
    print('Show max patch number from SQL table')
    print(MaxNum)
#if MaxNum == latest_patch:
#  print("Equal")
#else:
#    tsql = "UPDATE PatchNumber SET LatestPatchNumber = ?, Date = ? WHERE Id = 3;"
#    with cursor.execute(tsql, latest_patch, formatted_date):
#        print ('Successfully Updated Patch Table!')
if MaxNum == latest_patch:
   print("Equal")
else:
    file_list2 = os.listdir(service_pack_folder)
    def last_4chars(x):
        return (x[-4:])
    sorted(file_list2, key=last_4chars)
    print(file_list2)
    a = file_list2
    a.index(MaxNum)
    b = a[a.index(MaxNum):]
    c = (b[1:])
    print(c)
    for file_list_import in c:
        print("Executing Patch: " + file_list_import + " Now")
        sql_cmd = ['sqlcmd', '-I', '-b', '-V', '10', '-S', server, '-d', database, '-U', username, '-P', password, '-i', service_pack_folder + "/" + file_list_import]
        process = subprocess.call(sql_cmd, encoding="utf-8")
        if process == 0:
            print("success")
            tsql = "UPDATE PatchNumber SET LatestPatchNumber = ?, Date = ? WHERE Id = 1;"
            with cursor.execute(tsql, file_list_import, formatted_date):
                print ('Successfully Updated Patch Table!')
        else:
            print("Error patch file: " + file_list_import + " Exit")
            break

Как раз в таблицу пишет последний правильный патч и на ошибочном обрывает

Отредактировано vitk (Ноя. 18, 2019 11:46:11)

Офлайн

#7 Ноя. 18, 2019 18:39:34

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Импорт SQL патчей с помощью цикла

vitk
Я не пойму как мне сделать модулем, то что я сейчас пытаюсь сделать, Можете пример показать какойто ?
ок вот есчё раз ссылка на стандартную библиотеку там есть примеры итд итп
vitk
Спасибо что помагаете !
незаче (= … такое …



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Ноя. 18, 2019 18:41:06)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version