Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修复已使用引擎实例打开的Firebird错误数据库,该数据库与当前的';_Python_Flask_Sqlalchemy_Firebird_Flask Sqlalchemy - Fatal编程技术网

Python 如何修复已使用引擎实例打开的Firebird错误数据库,该数据库与当前的';

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

我有一个使用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.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/…