Python读取Firebird的fdb文件时遇SQLCODE-104错误(表名BLOB)
解决Firebird 2.5中执行
select * from 'BLOB'的SQLCODE-104错误 错误根源
Firebird SQL语法明确规定:单引号仅用于包裹字符串常量,不能用来标识表名或列名。当你用'BLOB'时,数据库会将其解析为字符串而非表名,因此触发"Token unknown"错误。此外,BLOB是Firebird的保留关键字,直接作为表名使用时必须转义。
修复方案
针对保留关键字作为表名的场景,Firebird支持两种合法转义方式:
- 用双引号包裹表名(默认
QUOTED_IDENTIFIER参数已开启,无需额外配置) - 用方括号包裹表名(兼容多SQL方言写法)
修正后的代码示例
假设原连接与查询代码如下,修正后:
import fdb # 建立连接 conn = fdb.connect( host='localhost', database='target_db.fdb', user='sysdba', password='masterkey' ) cursor = conn.cursor() # 错误写法:用单引号包裹表名 # cursor.execute("select * from 'BLOB'") # 正确写法1:双引号转义保留字表名 cursor.execute('select * from "BLOB"') # 正确写法2:方括号转义(可选) # cursor.execute('select * from [BLOB]') # 导出数据逻辑 rows = cursor.fetchall() # 这里可添加将数据写入CSV/Excel等文件的逻辑 for row in rows: print(row) # 关闭连接 conn.close()
批量导出所有表数据的优化方案
如果目标是导出所有表数据,建议通过系统表自动获取表名,避免手动指定时的语法错误:
import fdb conn = fdb.connect( host='localhost', database='target_db.fdb', user='sysdba', password='masterkey' ) cursor = conn.cursor() # 查询所有用户自定义表(排除系统表和视图) cursor.execute(""" SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0 AND RDB$VIEW_BLR IS NULL """) # 清理表名中的空白字符 tables = [row[0].strip() for row in cursor.fetchall()] for table in tables: # 自动判断并转义保留字表名 if table.upper() in fdb.reserved_words: quoted_table = f'"{table}"' else: quoted_table = table # 执行查询 cursor.execute(f"SELECT * FROM {quoted_table}") rows = cursor.fetchall() # 示例:打印表名和数据,可替换为写入文件逻辑 print(f"=== 表 {quoted_table} 数据 ===") for row in rows: print(row) conn.close()
内容的提问来源于stack exchange,提问作者Kareem Etefy
相关产品推荐
相关产品推荐

