【问题标题】:SQLAlchemy utils drop database statement cannot be used inside a user transactionSQLAlchemy utils drop database 语句不能在用户事务中使用
【发布时间】:2020-02-21 17:19:22
【问题描述】:

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

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 数据库 my_database] E

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

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

【问题讨论】:

    标签: sqlalchemy flask-sqlalchemy sqlalchemy-utils


    【解决方案1】:

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

    关键似乎是告诉 engine 使用 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)
    

    【讨论】:

    • 很有趣,谢谢。我相信我像这样创建了引擎并且仍然出现错误,但是我有很多排列,也许我做了一些不同的事情:engine = create_engine(self.config.SQLALCHEMY_DATABASE_URI, connect_args={'autocommit': True},isolation_level='AUTOCOMMIT ')
    • @t_warsop,为什么这对你有用?如果我在每条语句后添加engine.execute('COMMIT'),它会失败,但autocommit: True 有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2015-08-28
    • 2019-06-01
    相关资源
    最近更新 更多