在 Mac M2 上使用 Python 脚本连接到 Sybase IQ 服务器

问题描述 投票:0回答:1

我正在尝试连接到 Sybase 服务器以使用在我的 Mac M2 芯片上运行的 Python 脚本提取一些数据。

我尝试连接的 Sybase IQ 服务器版本:

SAP IQ SAP IQ/16.1.040.1841/16220/P/SP04.11/Sun_x64/OS 5.11/64位/2021-11-01

我能够使用 JConnect JDBC 驱动程序DBeaver 客户端成功连接。

https://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc01776.1604/doc/html/san1357754912881.html

jConnect (TM) for JDBC (TM) jConnect (TM) for JDBC(TM)/16.0 SP03 PL02(内部版本 27403)/P/EBF27518/JDK 1.6.0/jdbcmain/OPT/周一 8 月 28 日 18:41:14 PDT 2017

我正在尝试使用 Python 脚本自动化某些工作负载,并希望从本地计算机建立相同的连接。

我正在使用 jaydebeapi 库 (https://pypi.org/project/JayDeBeApi/) 来建立连接。连接字符串如下所示:

    jconn4_file_path = ["/Users/abishek.arunachalam/Library/DBeaverData/drivers/drivers/sybase/jconnect/jconn4.jar"]
    driver = "com.sybase.jdbc4.jdbc.SybDriver"
    connection_string = f"jdbc:sybase:Tds:{hostname}:2055?ServiceName={database}"

    conn = jaydebeapi.connect(
                    driver,
                    connection_string,
                    [username, password],
                    jconn4_file_path
                )

由于我的是M2机器,所以我使用的是zulu-21.jdk(https://docs.azul.com/core/install/macos)版本的Java JDK和3.12版本的Python。我使用相同的 JConnect JDBC 驱动程序路径。

出于某种奇怪的原因,当我尝试连接时,出现以下错误:找不到合适的驱动程序:

连接到 Sybase 数据仓库时出错:java.sql.SQLException:找不到 jdbc:sybase:Tds:hostname?ServiceName=database_name 的合适驱动程序

我尝试过将 SQL Server ODBC 驱动程序与 pyodbc 和 pymysql 一起使用,但由于与 M2 Apple 芯片一起使用的限制而没有成功。非常感谢任何有关调试或为我指明正确方向的帮助。

我在使用 jaydebeapi 连接时遵循了此操作: Python 中的 Sybase IQ 连接

python-3.x sybase apple-silicon jaydebeapi
1个回答
0
投票

不久前,我在分析旧 Sybase (SAP ASE 16.0) 数据库中的数据时遇到了同样的“没有找到适合 jdbc 的驱动程序”错误。如果我没记错的话,有些人建议线程问题可能会导致此错误,但没有人有可行的解决方案。

我最终使用了jpype.dbapi2,它比 jaydebeapi 更快。

import jpype
import jpype.dbapi2

hostname = 'host'
port = '2055'
database_name = 'db_name'
database_user = 'username'
database_pass = 'password'

connection_string = f"jdbc:sybase:Tds:{hostname}:{port}/{database_name}"

jpype.addClassPath(r'/path/to/jconn4.jar')
jpype.startJVM()

try:
    conn = jpype.dbapi2.connect(connection_string,
                                driver="com.sybase.jdbc4.jdbc.SybDriver",
                                driver_args={
                                    "user": database_user,
                                    "password": database_pass
                                })

except jpype.dbapi2.Error as err:
    print("Error: " + str(err))

cursor = conn.cursor()
cursor.execute("SELECT TOP 1 * FROM table_name")
result = cursor.fetchall()
print(result)
© www.soinside.com 2019 - 2024. All rights reserved.