我下面的代码失败,并显示消息
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会话中执行了以上操作。
答案 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)