SQLAlchemy utils删除数据库语句不能在用户事务内使用

时间:2019-10-25 10:48:00

标签: sqlalchemy flask-sqlalchemy sqlalchemy-utils

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

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语句不能在用户内部使用   transaction.DB-Lib错误消息20018,严重性16:\ n常规SQL   服务器错误:检查来自SQL Server的消息\ n')E [SQL:DROP   DATABASE my_database] E

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

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

1 个答案:

答案 0 :(得分:0)

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

关键似乎是告诉引擎使用自动提交

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

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)

of

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

但是,按如下所示在引擎创建中添加autocommit选项可以消除错误并按预期进行DROPs和CREATEs数据库“ 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)