Python JayDeBeApi触发器java.sql.SQLException:未找到合适的驱动程序

Python JayDeBeApi触发器java.sql.SQLException:未找到合适的驱动程序,python,jdbc,flask,teradata,jaydebeapi,Python,Jdbc,Flask,Teradata,Jaydebeapi,我正在尝试使用包JayDeBeApi连接到python3中的Teradata数据库。这是使用Flask和Flask Restplus的API项目的一部分 这里有一个简单的工作示例来重现这个问题。 在终端窗口中,键入以下命令以设置工作站: # Install JVM sudo apt-get install default-jre # Create Python virtual environment sudo apt-get install python3-venv python3 -m ve

我正在尝试使用包JayDeBeApi连接到python3中的Teradata数据库。这是使用Flask和Flask Restplus的API项目的一部分

这里有一个简单的工作示例来重现这个问题。 在终端窗口中,键入以下命令以设置工作站:

# Install JVM
sudo apt-get install default-jre

# Create Python virtual environment
sudo apt-get install python3-venv
python3 -m venv jdbc
source jdbc/bin/activate

# Install Python packages in virtual environment
pip3 install --upgrade pip
pip3 install jaydebeapi
pip3 install flask
创建包含以下内容的app.py文件:

from flask import Flask
import jaydebeapi

app = Flask(__name__)


def get_jdbc_connection():
    connection = jaydebeapi.connect(
        'com.teradata.jdbc.TeraDriver',
        'jdbc:teradata://edw-dev.company.org',
        {'user': 'LOGIN', 'password': 'PASSWORD', 'tmode': 'TERA', 'charset': 'UTF8'},
        '/home/alexis/teradataDriverJdbc.jar')
    return connection


@app.route('/hello/')
def hello_world():
    print('Init second connection')
    get_jdbc_connection()
    print('Success')
    return 'Hello world!'


if __name__ == '__main__':
    print('Init connection')
    test_connection = get_jdbc_connection()
    test_connection.close()
    print('Init connection closed')
    app.run(host='localhost', port=5000, threaded=True, debug=True)
在激活虚拟环境的终端窗口中,键入以下内容:

python3
>>> import app
>>> app.get_jdbc_connection()
<jaydebeapi.Connection object at 0x7f28ecb2ebe0>
python3 app.py
Init connection
Init connection closed
 * Running on http://localhost:5000/ (Press CTRL+C to quit)
 * Restarting with stat
Init connection
Init connection closed
 * Debugger is active!
 * Debugger PIN: 301-429-987
   def get_jdbc_connection():
        import jpype
        if jpype.isJVMStarted() and not jpype.isThreadAttachedToJVM():
            jpype.attachThreadToJVM()
            jpype.java.lang.Thread.currentThread().setContextClassLoader(jpype.java.lang.ClassLoader.getSystemClassLoader())
        connection = jaydebeapi.connect(
            'com.teradata.jdbc.TeraDriver',
            'jdbc:teradata://edw-dev.company.org',
            {'user': 'LOGIN', 'password': 'PASSWORD', 'tmode': 'TERA', 'charset': 'UTF8'},
            '/home/alexis/teradataDriverJdbc.jar')
        return connection
在浏览器中,导航到 您将收到以下错误消息,与我在上面第一条消息中粘贴的错误消息相同:

备注:我还创建了一个关于Github项目的问题:


编辑:根据baztian的建议,我提出了关于JPypeGithub项目的问题:

这可能是一个jPype问题。Jpype是JayDeBeApi的基础。github上存在一些未解决的jpype问题。请确保您使用的是最新的jpype版本。否则,您必须为jaydebeapi提供PR,或者希望有人为您修复它。 也可以考虑使用Jython和JayDeBeApi。

<强>编辑< /强>:还考虑使用JyDeBAPI来封装对模块的访问的专用Python信号量。

< P>一个解决问题的方法如下:

python3
>>> import app
>>> app.get_jdbc_connection()
<jaydebeapi.Connection object at 0x7f28ecb2ebe0>
python3 app.py
Init connection
Init connection closed
 * Running on http://localhost:5000/ (Press CTRL+C to quit)
 * Restarting with stat
Init connection
Init connection closed
 * Debugger is active!
 * Debugger PIN: 301-429-987
   def get_jdbc_connection():
        import jpype
        if jpype.isJVMStarted() and not jpype.isThreadAttachedToJVM():
            jpype.attachThreadToJVM()
            jpype.java.lang.Thread.currentThread().setContextClassLoader(jpype.java.lang.ClassLoader.getSystemClassLoader())
        connection = jaydebeapi.connect(
            'com.teradata.jdbc.TeraDriver',
            'jdbc:teradata://edw-dev.company.org',
            {'user': 'LOGIN', 'password': 'PASSWORD', 'tmode': 'TERA', 'charset': 'UTF8'},
            '/home/alexis/teradataDriverJdbc.jar')
        return connection

我确认我使用的是JPype1的最新版本,目前为0.6.2。你使用Jython是什么意思?JayDeBeApi与cPython或。Jython是用Java实现的Python。它具有使用Java代码的完美功能。这样,JayDeBeApi就可以避免使用jpype,尤其是在多线程的情况下,jpype还不是100%成熟。AFAIK Jython目前只实现Python2.7。我面临这个问题,但只有在直接运行Python时,通过笔记本运行不会产生这样的错误。有什么问题吗?当我不得不重新连接时,这对我很有效,但我不清楚为什么。