使用 isql-fb 与 firebase 连接有效,但不使用 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 Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: -104 Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 1 SHOW in /home/user/firebird.php:23

Python3:

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个回答
0
投票

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

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

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

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