我在一个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'})