可以使用 isql-fb 与 Firebird 连接,但不能使用 PHP 或 Python

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

我有一个基于 Firebird 数据库(版本 3.0)的第三方应用程序。为了统计和进一步处理数据,我正在考虑定期将数据库复制到 Linux 服务器,并通过 Web 界面(PHP/Laravel)提供所有数据。无法直接访问数据库,因为数据在处理过程中也会发生变化。但是,我无法访问数据库并需要一些帮助。

系统:Ubuntu Server 20.04 全新安装,标准安装中使用来自 apt 源的 Firebird 3.0,不更改 firebird.conf。 通过 isql-fb 进行访问是可行的,我可以用它执行所有查询。

$ isql-fb
Use CONNECT or CREATE DATABASE to specify a database
SQL> connect DB.FDB user 'sysdba' password 'password';
Database: DB.FDB, User: SYSDBA
SQL> show tables;
     [list of all tables]

当我尝试通过 PHP 或 Python 访问时,在这两种情况下都会收到类似的错误消息:

这两个脚本都是来自文档的极简查询,执行“显示表”或“从表中选择*”。

有人有什么想法吗?

我尝试过带和不带完整路径的连接字符串。两个脚本都与数据库位于同一目录中。

try {
    $dsn = "firebird:host=127.0.0.1;dbname=DB.FDB;charset=UTF8";
    $pdo = new PDO($dsn, 'sysdba', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}

$query = $pdo->query("SHOW TABLES");

PHP 致命错误:未捕获的 PDOException:SQLSTATE[HY000]:常规 错误:-104 动态 SQL 错误 SQL 错误代码 = -104 令牌未知 - 第 1 行第 1 列显示在 /home/user/firebird.php:23

Python 3:

import fdb

con = fdb.connect(
    dsn='localhost:DB.FDB',
    user='sysdba', password='password',
    charset='UTF8' # specify a character set for the connection
)

print(con)
cur = con.cursor()
cur.execute("show tables")
Traceback (most recent call last):
  File "/home/user/firebird.py", line 17, in <module>
    cur.execute("show tables;")
  File "/usr/lib/python3/dist-packages/fdb/fbcore.py", line 3626, in execute
    self._ps = PreparedStatement(operation, self, True)
  File "/usr/lib/python3/dist-packages/fdb/fbcore.py", line 2253, in __init__
    raise exception_from_status(DatabaseError, self._isc_status,
fdb.fbcore.DatabaseError: ('Error while preparing SQL statement:\n- SQLCODE: -104\n- Dynamic SQL Error\n- SQL error code = -104\n- Token unknown - line 1, column 1\n- show', -104, 335544569)
python php sql firebird
1个回答
1
投票

SHOW TABLES
是专门的 ISQL 命令。 DSQL 不支持它,您可以在语言参考中看到。

要获取 DSQL 中的表列表,您应该查询系统表,例如 RDB$RELATIONS。

顺便说一句,Firebase 和 Firebird 是两种完全不同的产品。

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