Python Firebird 驱动程序通过连接或创建数据库引发“不是目录”异常

问题描述 投票:0回答:1

我正在 Ubuntu 22.04.3 LTS 下编写一个 Python3 脚本,以在 Firebird3.0 服务器下使用 Firebird 数据库。我使用 firebird.driver 库。但我不断收到错误“不是目录”。即使我处理最简单的情况,它们看起来也像 firebird 驱动程序文档中的代码示例。

我尝试使用函数 connect 打开现有数据库,但出现以下异常:

  File "/home/izyakantorovich/Documents/projects/altium-db/altium-db-sync/db_builder.py", line 359, in db_copy_tables
    self.src_conn = fb.connect(self.src_db_file, user=self.USERNAME, password=self.PASSWORD, charset='utf-8')
  File "/home/izyakantorovich/.local/lib/python3.10/site-packages/firebird/driver/core.py", line 2132, in connect
    return __make_connection(False, dsn, db_config.utf8filename.value, dpb.get_buffer(),
  File "/home/izyakantorovich/.local/lib/python3.10/site-packages/firebird/driver/core.py", line 2047, in __make_connection
    att = provider.attach_database(dsn, dpb, 'utf-8' if utf8filename else FS_ENCODING)
  File "/home/izyakantorovich/.local/lib/python3.10/site-packages/firebird/driver/interfaces.py", line 1294, in attach_database
    self._check()
  File "/home/izyakantorovich/.local/lib/python3.10/site-packages/firebird/driver/interfaces.py", line 113, in _check
    raise self.__report(DatabaseError, self.status.get_errors())
firebird.driver.types.DatabaseError: operating system directive access failed
-Not a directory

self.src_db_file 是 '/home/izyakantorovich/Documents/projects/altium-db/DXPSERVER.DAT' .DAT格式文件是一些与Firebird软件兼容的特殊DB。说实话,我不清楚它是什么,但是相同的代码(具有另一个指定的 DXPSERVER.DAT 文件路径)在 Windows 下非常有效。

我还尝试使用 create_database 函数创建一个新数据库,但得到了相同的异常(DatabaseError、Not a Directory 等)。我运行了下面的代码:

import firebird.driver as fb

def main():
    db = fb.create_database(database='/home/izyakantorovich/Documents/projects/altium-db/test.fdb',
                            user='SYSDBA', password='masterkey')

根据 Firebird 驱动程序文档,我在驱动程序函数调用中指定的数据库路径似乎采用正确的样式。我做错了什么?

python firebird ubuntu-22.04 firebird-3.0
1个回答
0
投票

有两个可能的问题:

  1. 您正在尝试通过 Firebird 服务器进行连接,并且运行该服务器的用户无权访问您的主目录,或者
  2. 您正在通过嵌入式 Firebird 进行连接,并且您的用户无权访问用于锁定文件的目录。

如果使用仅文件路径连接字符串,则很难说是哪种,因为实际的连接方法将取决于所使用的客户端库是否也可以访问数据库引擎库

plugins/libEngine12.so

如果您打算通过 Firebird 服务器进行连接,则:

  1. 将数据库放在运行 Firebird 的用户有权访问的位置(默认通常是用户
    firebird
    和/或组
    firebird
    ),即不是在您的主目录中,并且
  2. 在连接字符串中显式添加
    inet://localhost/
    前缀,后跟实际路径或旧 URL 前缀
    localhost:
    后跟路径。

如果您想使用嵌入式进行连接,请确保您是

firebird
组的成员(您需要在添加自己后重新加载组)。

© www.soinside.com 2019 - 2024. All rights reserved.