python - 如何在 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"
}
}
解决方案
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 一起使用,没有任何问题。
推荐阅读
- r - 将一个自定义条添加到 R 中的条形图
- html - 如何使用 flexbox 使桌面上的三列和小型设备中的一列响应?
- ruby - 从另一个 lambda 调用一个 lambda。为什么顺序很重要?
- android - 从 alertdialog android studio 获取字符串
- c# - 引用类类型的只读属性
- php - 如果“匿名”字段为 1,Laravel 雄辩,将“用户名”更改为匿名
- ruby-on-rails - 带有 JQuery-ui-rails 日期的 Rails 5.2 Datepicker 偶尔保存日期
- c# - 如何在 C# 中设置三个接受用户输入并对输入进行数学运算的方法?
- node.js - Nodejs、DTO、方法的输入类型和返回类型
- r - 如何使用rentrez从文章中提取作者和链接?