3

SQL Server 2008でTSQLを使用し、pyodbcをトランスポートとして使用してsqlalchemyを使用して、開発中にdbの復元を自動化しようとしています。

私が実行しているコマンドは次のとおりです。

"""CREATE DATABASE dbname

データベース dbname FROM DISK='C:\Backups\dbname.bak' WITH REPLACE,MOVE 'dbname_data' TO 'C:\Databases\dbname_data.mdf',MOVE 'dbname_log' TO 'C:\Databases\dbname_log.ldf' """

残念ながら、SQL Management Studio では、コードが実行された後、DB が「復元中...」の状態のままであることがわかります。

管理スタジオを介して復元すると、機能します。サブプロセスを使用して「sqlcmd」を呼び出すと、機能します。pymssql は認証に問題があり、そこまで到達しません。

何がうまくいかないのですか?

4

4 に答える 4

4

BACKUP ステートメントと RESTORE ステートメントは非同期で実行されるため、残りのコードに進む前に終了することはありません。

http://ryepup.unwashedmeme.com/blog/2010/08/26/making-sql-server-backups-using-python-and-pyodbc/で説明されているように while ステートメントを使用すると、これが解決されました。

# setup your DB connection, cursor, etc
cur.execute('BACKUP DATABASE ? TO DISK=?', 
            ['test', r'd:\temp\test.bak'])
while cur.nextset():
    pass
于 2013-02-08T13:33:25.000 に答える
2

以下を実行して、pyodbcから直接(sqlalchemyなしで)復元する問題を再現できません。

connection = pyodbc.connect(connection_string) # ensure autocommit is set to `True` in connection string
cursor = connection.cursor()
affected = cursor.execute("""CREATE DATABASE test
RESTORE DATABASE test FROM DISK = 'D:\\test.bak' WITH REPLACE, MOVE 'test_data' TO 'D:\\test_data.mdf', MOVE 'test_log' to 'D:\\test_log.ldf' """)
while cursor.nextset():
    pass

明確にする必要があるいくつかの質問:

  • sqlalchemyを使用して復元を行うために使用されているコードは何ですか?
  • どのバージョンのSQLServerODBCドライバーが使用されていますか?
  • SQL Serverログに復元に関連するメッセージはありますか?

Cursor.nextset()の例を提供してくれたgeographikaに感謝します。

于 2010-11-24T20:05:07.007 に答える