Форум сайта python.su
Добрый !
Писал процедуру копирования. Сам процесс проходил успешно, кроме финала.
Вижу, что файл создается, но после завершения скрипта - сразу пропадает. В мусорке нет, на диске нет.
Извините, вопрос почти сразу закрылся решением (см. ниже)
Может, пригодится кому-нить
# -*- coding: utf-8 -*- import pyodbc import time db_conn=pyodbc.connect('DRIVER={SQL Server};SERVER=192.168.0.3;DATABASE=base_name;UID=username;PWD=password',autocommit=True) db_cursor=db_conn.cursor() db_cursor.execute(r"BACKUP DATABASE database_name TO DISK='d:\sql\backup\123.bak' ") # !!! time.sleep(1) db_cursor.close() db_conn.close()
Отредактировано Ace (Ноя. 3, 2018 06:30:58)
Офлайн
AceВообще, коммит принято делать
почему-то без костыля в виде паузы не работает
Офлайн
Пробовал в различных комбинациях. Представленный код минимально рабочий.
Если поставить коммит , но убрать паузу - не работает. Т.е симптом именно как в топике - файл создается, а после выполнения скрипта удаляется.
Отредактировано Ace (Ноя. 3, 2018 06:32:43)
Офлайн
ну знаете.
У вас код немного марсианский тоже между прочим.
вы либо открывайте файл питоном через
with open(…) as f:
И заполняйте его селектом.
Или выполняйте бекап через subprocess
а то как то белое с квадратным смешано.
Офлайн
Ну почему марсианский.
Эта просто выполнение средствами питона типовых команд MS SQL server.
При их выполнении из MS SQL Studio не надо никакого колдовства - просто выполняется и сохраняет файл куда указано.
Офлайн
py.user.nextНу вообще-то BACKUP это не DML и не DDL, т.к. команда не определяет структуру данных и не вмешивается в них. Поэтому не вижу в коммите. Тем более, в строке соединения включен автокомит.
Офлайн
AceСами модули питона могут быть неправильными, так как они часто сторонние, поэтому обычная логика здесь не применима.
Поэтому не вижу в коммите.
Офлайн
Так я на боевой базе и пробую. с паузой работает, без пауз файл бэкапа пропадает.
Пробовал одним файлом бэкапить несколько баз, паузу стояла после всех команд бэкапа - сохранился только последний файл.
Правльно понимаю, вы предлагаете после самой команды бэкапа еще дать явную SQL COMMIT или курсоровский коммит-метод из питона ?
Офлайн
Хорошо. Пытаемся провести ПФЭ. Всю обвязку писать не буду, только нужное
1.
db_cursor.execute(r"BACKUP DATABASE tcsbase_empty TO DISK='d:\sql\backup\tcsbase26.bak';COMMIT;")
db_cursor.execute(r"BACKUP DATABASE tcsbase_empty TO DISK='d:\sql\backup\tcsbase26.bak';COMMIT;") db_conn.commit()
db_cursor.execute(r"BACKUP DATABASE tcsbase_empty TO DISK='d:\sql\backup\tcsbase26.bak'") db_conn.commit()
db_cursor.execute(r"BACKUP DATABASE tcsbase_empty TO DISK='d:\sql\backup\tcsbase26.bak'") db_cursor.commit()
db_cursor.execute(r"BEGIN TRANSACTION") db_cursor.execute(r"BACKUP DATABASE tcsbase_empty TO DISK='d:\sql\backup\tcsbase26.bak'") db_cursor.execute(r"COMMIT TRANSACTION")
Отредактировано Ace (Ноя. 10, 2018 08:28:35)
Офлайн
AceА я предлагаю сделать маленькую базу и проверить этот скрипт на ней, убрав sleep() из него. Потому что пропадает файл не просто так, а по какой-то причине. Вот её и надо определить, а не действовать наугад.
Так я на боевой базе и пробую. с паузой работает, без пауз файл бэкапа пропадает.
Отредактировано py.user.next (Ноя. 10, 2018 09:00:31)
Офлайн