Невозможно восстановить в транзакции;автокоммит включен - PullRequest
0 голосов
/ 05 марта 2019

Я использую sqlalchemy с pyodbc для восстановления файла mssql .bak.Я следовал советам из предыдущих сообщений относительно обхода транзакций, но, похоже, это ничего не меняет.Любая помощь будет оценена.

from urllib.parse import quote_plus
from sqlalchemy import create_engine

params = quote_plus("Driver={SQL Server Native Client 11.0};"
                    "Server=Computer\SQLEXPRESS;"
                    "Database=master;"
                    "Trusted_Connection=yes;")

engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
connection = engine.raw_connection()

db_path = r"C:\\Path\\to\\OutputDB.bak"
move_path = r"C:\\Path\\to\\backup\\db.mdf"
move_log_path = r"C:\\Path\\to\\backup\\db_Log.ldf"

sql_cmd = f"""
    RESTORE DATABASE [db]
    FROM DISK = N'{db_path}'
    WITH FILE = 1,
    MOVE N'db'
    TO N'{move_path}',
    MOVE N'test_log'
    TO N'{move_log_path}',
    RECOVERY,
    NOUNLOAD,
    REPLACE,
    STATS = 5
"""


connection.autocommit = True

cursor = connection.cursor()

cursor.execute(sql_cmd)
while cursor.nextset():
    pass

connection.autocommit = False

Я получаю следующее сообщение об ошибке:

ProgrammingError: ('42000', '[42000] [Microsoft] [Собственный клиент SQL Server11.0] [SQL Server] Невозможно выполнить операцию резервного копирования или восстановления в транзакции. (3021) (SQLExecDirectW); [42000] [Microsoft] [Собственный клиент SQL Server 11.0] [SQL Server] RESTORE DATABASE прерывается ненормально. (3013)')

1 Ответ

0 голосов
/ 07 марта 2019

Мне удалось это исправить, передав connect_args={'autocommit': True} в create_engine.Ни cursor.execute(sql_cmd).execution_options(autocommit=True), ни connection.autocommit = True не работают.

from urllib.parse import quote_plus
from sqlalchemy import create_engine

params = quote_plus("Driver={SQL Server Native Client 11.0};"
                    "Server=Computer\SQLEXPRESS;"
                    "Database=master;"
                    "Trusted_Connection=yes;")

engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params, connect_args={'autocommit': True})
connection = engine.raw_connection()

db_path = r"C:\\Path\\to\\OutputDB.bak"
move_path = r"C:\\Path\\to\\backup\\db.mdf"
move_log_path = r"C:\\Path\\to\\backup\\db_Log.ldf"

sql_cmd = f"""
    RESTORE DATABASE [db]
    FROM DISK = N'{db_path}'
    WITH FILE = 1,
    MOVE N'db'
    TO N'{move_path}',
    MOVE N'test_log'
    TO N'{move_log_path}',
    RECOVERY,
    NOUNLOAD,
    REPLACE,
    STATS = 5
"""

cursor = connection.cursor()

cursor.execute(sql_cmd)
while cursor.nextset():
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...