首页 > 解决方案 > 如何在 CentOS 中安装 jdbc 并在 python 函数中使用包?

问题描述

我是编码时使用 linux 实例的新手。我正在使用 CentOS 并且正在编写一个依赖于连接到 SQL 数据库的 python 脚本。我编写的连接到的函数如下所示:

import jaydebeapi
import pandas as pd 
import json 
from query import p1

def get_conn(conn_name, conf_file = 'data.json' ):
    conf_dict = json.load(open(conf_file, 'r'))
    c = conf_dict[conn_name.lower()]
    return (jaydebeapi.connect(jclassname=c['driver_name'], url=c['jdbc_url'],
                driver_args=[c['user'], c['passwd']])
           )

conn_scd = get_conn('ora_pdmsn')
scd_df = pd.read_sql(p1, conn_scd)
conn_scd.close()

print(scd_df)

这会导致以下错误:

TypeError: Class com.microsoft.sqlserver.jdbc.SqlServerDriver is not found

我尝试找到在 centOS 中安装此驱动程序的正确方法,但似乎没有任何效果。有什么建议吗?我的 JSON.data 的样例如下所示:

{"mssql":
    {   "conn_name":"ora_pdmsn", "driver_name":"com.microsoft.sqlserver.jdbc.SQLServerDriver",
        "jdbc_url":"internal_url",
        "user":"name", "passwd":"pass",
        "test_sql":"select CURRENT_TIMESTAMP as ts"
    }
}

标签: pythonjdbccentos

解决方案


jaydebeapi 需要访问包含您要使用的 JDBC 驱动程序的相关 JAR(Java 存档)文件。因此,您需要确保 JDBC 驱动程序位于 Java 类路径中,以便 jaydebeapi 在您运行程序时可以使用它。

当然,这也意味着您需要安装 Java。该java -version命令可以为您检查。


您是否已有相关的 JDBC JAR 文件?您需要的取决于:

  • 您正在使用的 MS-SQL Server 版本,以及
  • 您安装的 Java 版本

您可以从这里下载驱动程序的版本。这为您提供了 9.2 版本的驱动程序,在 3 个不同的文件中,用于 3 个 Java 版本(8、11 和 15)。

(如果您有旧版本的 SQL Server,则此版本的 JDBC 驱动程序可能不适合您。)

解压缩 zip 文件并在sqljdbc_9.2/enu目录中找到 JAR 文件。JAR 文件的名称表示它支持的 Java 版本:

mssql-jdbc-9.2.1.jre8.jar
mssql-jdbc-9.2.1.jre11.jar
mssql-jdbc-9.2.1.jre15.jar

获得正确的 JAR 文件后,您可以直接在 Python 连接代码中引用其位置,作为额外参数。

这是我这样做的版本(在我的情况下使用 MySQL,因为我没有 MS-SQL Server) - 为简单起见,我没有使用 JSON 文件:

jaydebeapi.connect("com.mysql.cj.jdbc.Driver",
                   "jdbc:mysql://localhost:3306/my_db",
                   ["myuser", "mypass"],
                   "/path/to/mysql-connector-java-8.0.25.jar")

当然,您会希望将所有这些详细信息从我的 MySQL 详细信息更改为您的 MS-SQL Server 详细信息 - 但请注意指向 JAR 文件的最后一个值。


或者,您可以设置 Java 类路径并使用它,而不是在代码中保留 JAR 文件位置。在这种情况下,类路径将指向一个目录,该目录将包含 JAR 文件。我发现这种方法不太方便,但这取决于你。


SQL Server JDBC 驱动程序的另一个选项是使用 jTDS - 请参见此处。我已经将它与旧版本的 SQL Server 一起使用,没有任何问题。


推荐阅读