Informix + SQLAlchemy查找不存在的表

时间:2012-03-22 09:46:02

标签: sqlalchemy db2 informix

我正在尝试使用SQLAlchemy连接到Informix数据库。我的所有测试似乎都表明连接正常;但是,每当我尝试执行数据库读取时,都会收到错误:

DatabaseError: (DatabaseError) SQLCODE -217 in PREPARE: 
IX000: Column (current_role) not found in any table in the query (or SLV is undefined).
 'select CURRENT_ROLE from systables' ()

现在我连接的数据库没有CURRENT_ROLE,那么我该如何解决这个问题?

我对错误的交互式回溯如下所示:

https://gist.github.com/2157378

违规行是:

 File "build/bdist.linux-i686/egg/sqlalchemy/dialects/informix/base.py", line 593, in _get_default_schema_name
    return connection.execute('select CURRENT_ROLE from systables').scalar()

此问题是否有解决方法?

我现在被认为这是SQLAlchemy中的一个错误(在与#sqlalchemy中的用户交谈后),我已经提交了错误报告:

http://www.sqlalchemy.org/trac/ticket/2448

1 个答案:

答案 0 :(得分:0)

您尚未确定使用的是哪个版本的IBM Informix Dynamic Server(IDS),或者您正在使用哪个平台,因此很难为您提供帮助。

似乎SQLAlchemy需要比您使用的更新版本的Informix。令我惊讶的是,NILdic函数CURRENT_ROLE似乎在IDS 11.70中可用(在RHEL 5上针对x86 / 64在11.70.FC4上测试)。它最近没有添加,因此它将在任何11.70版本中,并且可能在某些早期版本中(但不早于您使用的版本)。

我不确定SQLAlchemy中有多少bug。如果你使用的Informix版本真的很旧,那么它们添加对它的支持是有限的。您可以通过运行找出您正在使用的版本:

SELECT DBINFO('version', 'full')
  FROM 'informix'.systables
 WHERE tabid = 1;

如果这不起作用,那么您的服务器已经过多年了。


附录

再考虑一下......我想知道SQLAlchemy将如何处理这个角色。它可能不应该试图分析你是否有权限;它应该尝试操作并处理失败。这会更快,特别是在您确实拥有权限的常见情况下。

可能有两个问题:

  1. SQLAlchemy应该知道,旧版本的IDS的某些(尚不确定)列表不支持CURRENT_ROLE。
  2. SQLAlchemy应该检查为什么需要了解当前的角色。