Python 如何修复已使用引擎实例打开的Firebird错误数据库,该数据库与当前的';
我有一个使用Flask_sqlalchemy的Flask应用程序:Python 如何修复已使用引擎实例打开的Firebird错误数据库,该数据库与当前的';,python,flask,sqlalchemy,firebird,flask-sqlalchemy,Python,Flask,Sqlalchemy,Firebird,Flask Sqlalchemy,我有一个使用Flask_sqlalchemy的Flask应用程序: from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config.from_pyfile(filename='settings.py', silent=True) db = SQLAlchemy(app=app) 我想从守护进程连接到同一个数据库。在守护进程中,我只导入db并使用db.engine.e
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_pyfile(filename='settings.py', silent=True)
db = SQLAlchemy(app=app)
我想从守护进程连接到同一个数据库。在守护进程中,我只导入db并使用db.engine.execute
进行SQLAlchemy查询。但当守护进程启动时,主应用程序无法连接到数据库。 在日志中,我看到:
fdb.fbcore.DatabaseError: ('Error while connecting to database:\n- SQLCODE:
-902\n- I/O error during "lock" operation for file "main.fdb"\n- Database
already opened with engine instance, incompatible with current', -902,
335544344)
我尝试使用隔离级别:
from fdb.fbcore import ISOLATION_LEVEL_READ_COMMITED_LEGACY
class TPBAlchemy(SQLAlchemy):
def apply_driver_hacks(self, app_, info, options):
if 'isolation_level' not in options:
options['isolation_level'] = ISOLATION_LEVEL_READ_COMMITED_LEGACY
return super(TPBAlchemy, self).apply_driver_hacks(app_, info, options)
并将其替换为:
db = SQLAlchemy()
致:
但这只会造成另一个错误:
TypeError: Invalid argument(s) 'isolation_level' sent to create_engine(),
using configuration FBDialect_fdb/QueuePool/Engine. Please check that the
keyword arguments are appropriate for this combination of components.
如果能提供完整的示例来解决我的问题,我将不胜感激。您的连接字符串用于嵌入式数据库。一次只允许与嵌入式数据库建立一个“连接” 如果启用了
环回
提供程序,则可以将连接字符串更改为:
localhost:/var/www/main.fdb
mydatabasealias=/var/www/main.fdb
或者,如果启用了Remote
提供程序,则必须从另一个远程节点访问数据库,并假设Firebird服务器位于192.168.1.100
上,将连接字符串更改为
192.168.1.100:/var/www/main.fdb
如果您打算使用Engine12
提供程序(嵌入式提供程序),则必须停止已连接到该数据库的任何内容,因为您无法使用该提供程序同时处理两个用户
另外,尝试设置一些数据库别名,这样就不会像那样显式地指定数据库。在Firebird 3.0.3中,查看databases.conf,您可以在其中执行以下操作:
localhost:/var/www/main.fdb
mydatabasealias=/var/www/main.fdb
现在,您的连接字符串将是
mydatabasealias
,而不是整个路径。您的连接字符串用于嵌入式数据库。一次只允许与嵌入式数据库建立一个“连接”
如果启用了环回
提供程序,则可以将连接字符串更改为:
localhost:/var/www/main.fdb
mydatabasealias=/var/www/main.fdb
或者,如果启用了Remote
提供程序,则必须从另一个远程节点访问数据库,并假设Firebird服务器位于192.168.1.100
上,将连接字符串更改为
192.168.1.100:/var/www/main.fdb
如果您打算使用Engine12
提供程序(嵌入式提供程序),则必须停止已连接到该数据库的任何内容,因为您无法使用该提供程序同时处理两个用户
另外,尝试设置一些数据库别名,这样就不会像那样显式地指定数据库。在Firebird 3.0.3中,查看databases.conf,您可以在其中执行以下操作:
localhost:/var/www/main.fdb
mydatabasealias=/var/www/main.fdb
现在,您的连接字符串将是
mydatabasealias
,而不是整个路径。您使用的连接字符串是什么?另一个进程使用的是同一个数据库吗?另一个应用程序使用的是什么连接字符串?还要注意,问题与事务隔离级别无关。该错误表示数据库由两个不同版本的Firebird打开(无论是服务器、嵌入式还是组合)。@markrotVeel我的连接URI对于这两个Firebird都是相同的+fdb:////var/www/main.fdb?charset=utf8 我使用相同的fdb。使用该连接字符串,您可能会在本地打开数据库(不是100%确定),这可能意味着它是使用Firebird Embedded打开的,这可能意味着使用了不同的版本。如果Firebird服务器正在运行,请使用主机名进行尝试,例如//localhost//var/…
您使用的连接字符串是什么?另一个进程使用的是同一个数据库吗?另一个应用程序使用的是什么连接字符串?还要注意,问题与事务隔离级别无关。该错误表示数据库由两个不同版本的Firebird打开(无论是服务器、嵌入式还是组合)。@markrotVeel我的连接URI对于这两个Firebird都是相同的+fdb:////var/www/main.fdb?charset=utf8 我使用相同的fdb。使用该连接字符串,您可能会在本地打开数据库(不是100%确定),这可能意味着它是使用Firebird Embedded打开的,这可能意味着使用了不同的版本。如果Firebird服务器正在运行,请使用主机名进行尝试,例如//localhost//var/…