无法从 table 以 Python fdb 中的“@”开始 select

Unable to select from table starting with "@" in Python fdb

我正在使用 FDB 模块通过 Python 从 Firebird 数据库中获取数据。 我正在尝试从名为 @TABLE_NAME 的 table 获取数据,在 table 名称中包含“@”不是我的主意,这使得无法在其上执行语句。当我尝试从正常 table 获取数据时,一切正常。 这个命令:

cur.execute("SELECT * FROM @TABLE_NAME")

return 这个错误:

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 15\n- @', -104, 335544569)

我不知道该怎么做,希望得到一些帮助。

"Regular identifiers" 在 Firebird SQL 服务器中不能包含 @ 符号,参见 Identifiers

使用 SQL 方言 3 你可以引用不规则的标识符,参见 SQL Dialects

但是你最好检查一下你是否真的在使用它。诚然,方言 1 已经过时了,今天任何合理的程序在创建和连接到 Firebird 数据库时都会设置方言 3。不过你检查一下会更安全。

您可以通过 select MON$SQL_DIALECT from MON$DATABASE 检查数据库 属性,请参阅 MON$DATABASE

我不知道如何查询连接方言,但似乎强制使用方言 1 连接到方言 3 数据库是相当奇特且难以做到的,因此您实际上可以假设它几乎永远不会发生.您仍然必须了解这一点,并且能够在极少数情况下检查连接打开代码,具体情况取决于方言。


在你确定你在 SQL 的现代方面后,你可以开始引用标识符:

SELECT * FROM "@TABLE_NAME"

根据 How to write string literals in python without having to escape them? 判断,您有多种方法可以做到这一点,例如:

  • C 风格 cur.execute( "SELECT * FROM \"@TABLE_NAME\"" )
  • 原始风格cur.execute( r'SELECT * FROM "@TABLE_NAME"' )
  • 和许多其他,使用 Unicode 数字代码和字符串表达式