将isolation_level添加到apachemod_wsgi服务器上的flask sqlalchemy应用程序后,



我在一个flask sqlalchemy,marshamlow应用程序中使用Apache mod_wsgi,使用pyodbc连接到远程ms-sql数据库,最近我被要求添加隔离级别"SNAPSHOT",我使用apply_driver_hacks

class SQLiteAlchemy(SQLAlchemy):
def apply_driver_hacks(self, app, info, options):
options.update({
'isolation_level': 'SNAPSHOT',
})
super(SQLiteAlchemy, self).apply_driver_hacks(app, info, options)

该项目是为了从ms-sql服务器访问图像blob数据并显示在网页上而构建的,在添加隔离级别后不久,我看到每隔几张图像就会产生内部错误,执行ctrl+f5操作会显示图像,但随后还有其他图像未显示,这在错误日志中mod_wsgi(pid=10694):处理wsgi脚本时发生异常pyodbc。编程错误:('42000',"[42000][Microsoft][ODBC Driver 13 for SQL Server][SQL Server]事务在数据库"testdb"中失败,因为该语句是在快照隔离下运行的,但该事务不是在快照隔离中启动的。在事务启动后,不能将事务的隔离级别更改为快照,除非事务最初是在快照隔离级别下启动的。(3951)(SQLExecDirectW)")

编辑后添加以下代码:

当不使用创建引擎时,我如何使用烧瓶sqlalchmey

我的app.py文件

app = Flask(__name__)
app.config.from_object('config.ProductionConfig')
db.init_app(app)
ma.init_app(app)

我的model.py文件

class SQLiteAlchemy(SQLAlchemy):
def apply_driver_hacks(self, app, info, options):
options.update({
'isolation_level': 'SNAPSHOT',
})
super(SQLiteAlchemy, self).apply_driver_hacks(app, info, options)
# To be initialized with the Flask app object in app.py.
db = SQLiteAlchemy()
ma = Marshmallow()

发动机级

如果您使用的是解密实现,那么您将可以访问创建引擎函数(以及作用域会话函数)。

但假设您使用的是Flask SQLAlchemy实现,这只是在后台调用sqlalchemy.create_engine(在这行)。

后者可能会受到攻击,因为似乎没有办法传递与引擎相关的选项;它们具体定义为#558:上的几行

options = {'convert_unicode': True}

在会话级别

这看起来可能会稍微容易一些,因为您可以在初始化SQLAlchemy时传递会话选项:请参阅此行。create_scoped_session方法期望能够作为session_options传递给__init__方法的字典。

因此,当您初始化库时,您可以尝试以下操作:

db = SQLiteAlchemy(session_options={'isolation_level': 'SNAPSHOT'})

相关内容

  • 没有找到相关文章

最新更新