1

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

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

返回此错误:

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)

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

4

1 回答 1

1

Firebird SQL 服务器中的“常规标识符”不能包含@符号,请参阅标识符

使用 SQL Dialect 3,您可以引用不规则标识符,请参阅SQL Dialects

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

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

我没有办法查询连接方言,但似乎强制方言 1 连接到方言 3 数据库是相当奇特的,而且很难做到,所以你实际上可以假设它几乎不会发生。您仍然必须知道这一点,并且能够在极少数情况下检查连接打开代码,这取决于方言的事情会出错。


在确保您处于 SQL 的现代方面之后,您可以开始引用标识符:

SELECT * FROM "@TABLE_NAME"

如何在 python 中编写字符串文字而不必转义它们来判断?你有很多方法可以做到这一点,例如:

  • C风格cur.execute( "SELECT * FROM \"@TABLE_NAME\"" )
  • 原始风格cur.execute( r'SELECT * FROM "@TABLE_NAME"' )
  • 和许多其他的,使用 Unicode 数字代码和字符串表达式
于 2020-05-16T14:51:49.637 回答