【问题标题】:'QVCI feature is disabled' ERROR when using existing Teradata Database to define models for use by flask app使用现有 Teradata 数据库定义模型以供烧瓶应用程序使用时出现“QVCI 功能已禁用”错误
【发布时间】:2019-12-25 05:24:47
【问题描述】:

在尝试围绕现有 Teradata 数据库构建我的烧瓶应用程序时,我遇到了一个问题,我从这个现有数据库定义了我的应用程序要使用的数据库模型。我收到 sqlalchemy.exc.DatabaseError: (teradata.api.DatabaseError) (9719, '[HY000] [Teradata][ODBC Teradata Driver]Teradata DatabaseQVCI 功能已禁用。')。我使用的是 teradata 版本 16.20,并且似乎在这个最新版本中禁用了 QVCI 功能。

我已经能够通过我的烧瓶应用程序使用 sqlalchemy 和 pyodbc 成功连接到 Teradata 数据库。所以问题不在于建立初始连接。我正在努力的地方是围绕我已经能够连接到的现有数据库构建我的烧瓶应用程序。我有一些示例代码,我可以根据我期望的另一个问题找到我的“users_table”并使其可用作我的烧瓶应用程序的“用户”类。但是,当尝试让 sqlalchemy 检索“users_table”时,teradata 告诉我 QVCI 功能已被禁用。这是我能够找到的导致错误的代码:

#!/usr/bin/python
# -*- mode: python -*-

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base

user = 'user_string'
pasw='password_string'
host = 'host_string'

engine = create_engine('teradata://'+ user +':' + pasw + '@'+ host + '/' + '?authentication=LDAP', convert_unicode=True, echo=False)

Base = declarative_base()
Base.metadata.reflect(engine)


from sqlalchemy.orm import relationship, bckref

class Users(Base):
    __table__ = Base.metadata.tables['users_table']


if __name__ == '__main__':
    from sqlalchemy.orm import scoped_session, sessionmaker, Query
    db_session = scoped_session(sessionmaker(bind=engine))
    for item in db_session.query(Users.id, Users.name):
        print(item)

运行后,我得到 sqlalchemy.exc.DatabaseError: (teradata.api.DatabaseError) (9719, '[HY000] [Teradata][ODBC Teradata Driver]Teradata DatabaseQVCI 功能已禁用。')。提前感谢您的帮助。

【问题讨论】:

    标签: python flask sqlalchemy odbc teradata


    【解决方案1】:

    我在使用 sqlalchemy 的 sqlalchemy-teradata 方言时遇到了同样的问题。对我来说,切换到teradatasqlalchemy 就足够了。似乎第一个不再被积极开发。第二个由 Teradata 官方支持并正在积极开发中。所以我想这是无论如何都要走的路!

    【讨论】:

      【解决方案2】:

      我对 QVCI 没有任何具体知识,但从我通过一些在线浏览收集到的信息是,它是一个数据库级功能,您可以启用/禁用它:

      http://knowledge.teradata.com/support/general/kcs.nsf/id/KCS018468

      检查您的 dbscontrol 标志,看看是否有启用它的选项。这是一个可能有帮助的链接:

      https://docs.teradata.com/reader/3v9n8mulIn_WRhsXpj609w/VEc7SwG43uPE51o9QiodPQ

      如果您在某个部分中看到标志并且它已被禁用,请尝试启用它。我认为您需要“修改”然后“写入”到 dbscontrol(并可能重新启动 DBS)才能使更改生效。

      更新
      另一种选择是将您的客户端 TD 驱动程序更新到最新版本。看起来有一些与 QVCI 相关的错误修复:

      https://teradata-docs.s3.amazonaws.com/doc/connectivity/tdnetdp/16.20/help/WhatsNew16000000.html

      【讨论】:

        【解决方案3】:

        此时应该启用QVCI。将您正在使用的 Teradata 驱动程序(在这种情况下似乎是 ODBC)升级到最新的补丁程序级别,可以容忍这种情况。

        您也可以考虑使用不需要 Teradata ODBC 或 pyodbc 的 teradatasqlalchemy 模块和 teradatasql 方言。

        【讨论】:

        • 感谢您的回复,@Fred。请允许我分别解决这些建议:1.)我的理解是 sqlalchemy 创建的连接引擎不需要像上面那样在连接字符串中定义的驱动程序。是否有参数可以在连接字符串中手动设置驱动程序? 2.)所以我确实尝试使用 teradatasqlalchemy 模块和 teradatasql 方言,但是,看起来参数“数据库”似乎没有实现......至少现在还没有。我应该在我的问题中提到的是,我想在我的连接字符串中设置一个默认数据库。
        • 您无需指定驱动程序,除非您安装了多个版本的 Teradata ODBC 并且 teradata: 方言默认为错误的版本。但是是的,您可以将driver=_theDriverName_ 附加到连接字符串。您是正确的,teradatasql 尚不支持将默认数据库设置为连接字符串的一部分。
        • teradata 模块/方言依赖于“OS 原生”Teradata ODBC 驱动程序,该驱动程序必须单独安装在客户端上。
        • 所以我把它作为我的新连接字符串python engine = create_engine('teradata://'+ user +':' + pasw + '@'+ host + '/db_name' + '?authentication=LDAP&driver=Teradata Database ODBC Driver 16.20', convert_unicode=True, echo=False),其中'db_name'是我的默认数据库的名称。但是,在驱动程序 16.20 中使用此连接字符串时,我仍然收到与“QVCI 功能已禁用”相同的错误。我错过了什么吗?谢谢。
        • 我应该更具体一些。默认情况下,您已经选择了 16.20 驱动程序。问题在于安装的 16.20 驱动程序的特定维护/修复/补丁级别。 (例如,16.20.00.01 会出现此问题。)您需要升级到更新的级别 - 因此最好使用适用于您客户端操作系统的最新级别。
        猜你喜欢
        • 2020-06-08
        • 1970-01-01
        • 2020-10-12
        • 1970-01-01
        • 2019-09-20
        • 1970-01-01
        • 2020-09-14
        • 2020-04-16
        • 1970-01-01
        相关资源
        最近更新 更多