You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:55:21