isql-fb可连接Firebird 3.0,但PHP/Python执行查询报错求助
解决Firebird 3.0中PHP PDO/Python fdb执行SHOW TABLES报错SQLCODE=-104的问题
核心问题在于:SHOW TABLES是Firebird命令行工具isql-fb的专属交互命令,不属于标准SQL语法。PDO、fdb这类标准SQL驱动只会执行符合SQL规范的语句,因此执行该命令会触发语法错误(SQLCODE=-104)。
替代方案:查询Firebird系统表获取表列表
Firebird通过系统表存储所有数据库元数据,你可以用标准SQL查询这些表来获取表信息:
1. 查询用户自定义表(排除系统表)
SELECT rdb$relation_name AS table_name FROM rdb$relations WHERE rdb$relation_type = 0 AND rdb$system_flag = 0 ORDER BY rdb$relation_name;
rdb$relation_type = 0:筛选普通表(视图对应值为1)rdb$system_flag = 0:排除Firebird自带的系统表- 若需排除视图,可额外添加
AND rdb$view_blr IS NULL
2. 查询所有表(包含系统表)
去掉rdb$system_flag = 0条件即可:
SELECT rdb$relation_name AS table_name FROM rdb$relations WHERE rdb$relation_type = 0 ORDER BY rdb$relation_name;
不同语言的实现示例
PHP PDO示例
$dsn = 'firebird:dbname=/path/to/your/database.fdb;charset=UTF8'; $user = 'sysdba'; $pass = 'your_password'; try { $pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->query("SELECT rdb$relation_name AS table_name FROM rdb$relations WHERE rdb$relation_type = 0 AND rdb$system_flag = 0 ORDER BY rdb$relation_name"); $tables = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($tables as $table) { echo $table['table_name'] . "\n"; } } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); }
Python fdb示例
import fdb conn = fdb.connect( dsn='/path/to/your/database.fdb', user='sysdba', password='your_password', charset='UTF8' ) cursor = conn.cursor() cursor.execute(""" SELECT rdb$relation_name AS table_name FROM rdb$relations WHERE rdb$relation_type = 0 AND rdb$system_flag = 0 ORDER BY rdb$relation_name """) tables = cursor.fetchall() for table in tables: print(table[0]) conn.close()
补充说明
Firebird的所有元数据(表结构、用户、权限等)都需要通过系统表/视图查询,类似SHOW DATABASE、SHOW COLUMNS等isql专属命令,都有对应的系统表查询替代方案,比如查询表字段可以用rdb$relation_fields表。
内容的提问来源于stack exchange,提问作者stfn
相关产品推荐
相关产品推荐

