2

我有下面的代码失败并显示消息

from sqlalchemy_utils.functions import database_exists, create_database, drop_database

url = f'mssql+pymssql://user:secret_password@db_host/my_database?charset=utf8'
if database_exists(url):
    drop_database(url)
create_database(url)

错误:

sqlalchemy.exc.OperationalError: (pymssql.OperationalError) (574, b'DROP DATABASE 语句不能在用户事务中使用。DB-Lib 错误消息 20018,严重性 16:\n一般 SQL Server 错误:检查来自 SQL Server 的消息\ n') E [SQL: 删除数据库 my_database] E

(此错误的背景:http ://sqlalche.me/e/e3q8 )

不知道我做错了什么 - 在线示例将其显示为有效代码。没有状态 - 我已经在一个新的 ipython 会话中执行了上述操作。

4

1 回答 1

0

我无法让它与 sqlalchemy-utils 一起使用,但我可以让它与 sqlalchemy 一起使用并执行 sql。

关键似乎是告诉引擎使用autocommit

例如,以下将生成您遇到的相同错误:

db_master = sqlalchemy.create_engine('mssql+pyodbc://server/master?driver=SQL+Server+Native+Client+11.0')

db_master.execute('DROP DATABASE IF EXISTS ' + destination_db)
db_master.execute('CREATE DATABASE ' + destination_db)

的:

sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', '[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]DROP DATABASE 语句不能在用户事务中使用。(574) (SQLExecDirectW )')

但是,按照以下将自动提交选项添加到引擎创建中会删除错误,并按预期删除和创建数据库“destination_db”:

db2_master = sqlalchemy.create_engine('mssql+pyodbc://server/master?driver=SQL+Server+Native+Client+11.0', connect_args = {'autocommit':True})

db2_master.execute('DROP DATABASE IF EXISTS ' + destination_db)
db2_master.execute('CREATE DATABASE ' + destination_db)
于 2020-01-13T09:19:06.430 回答