PYTHON 如何通过 JDBC驱动连接OceanBase?

【产品名称】OceanBase

【产品版本】2.7X

【问题描述】PYTHON 如何通过 JDBC驱动连接OceanBase。

python 可以通过 jaydebeapi 这个库来使用 JDBC驱动。

JayDeBeApi module allows you to connect from Python code to databases using Java JDBC. It provides a Python DB-API v2.0 to that database. 

https://github.com/baztian/jaydebeapi

安装: pip  install  jaydebeapi


示例代码如下:

import jaydebeapi


dirver = "com.alipay.oceanbase.jdbc.Driver"
url = "jdbc:oceanbase://IP地址:端口/用户?rewriteBatchedStateme&useUnicode=true&characterEncoding=utf-8"
user = "用户@租户#集群"
password = "密码"
jarFile = "E://common//temp//oceanbase-client-1.1.7.jar"
conn=jaydebeapi.connect(dirver,url,[user,password],jarFile)


curs = conn.cursor()
curs.execute("select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;")
rs = curs.fetchall()
for r in rs:
    print(r)
curs.close()
conn.close()

结果如下:

E:\anaconda3\python.exe E:/common/temp/obtest.py

('2021-06-23 17:55:48',)

Python直接用MySQL的库连就可以了

ORACLE 租户是无法用MYSQL连的。

如果用pymysql之类的mysql库去连接ORACLE租户的数据库会报错:

E:\anaconda3\python.exe E:/common/temp/obtest_as_mysql.py
Traceback (most recent call last):
  File "E:/common/temp/obtest_as_mysql.py", line 14, in <module>
    database='unview', charset='utf8')
  File "E:\anaconda3\lib\site-packages\pymysql\connections.py", line 353, in __init__
    self.connect()
  File "E:\anaconda3\lib\site-packages\pymysql\connections.py", line 633, in connect
    self._request_authentication()
  File "E:\anaconda3\lib\site-packages\pymysql\connections.py", line 907, in _request_authentication
    auth_packet = self._read_packet()
  File "E:\anaconda3\lib\site-packages\pymysql\connections.py", line 725, in _read_packet
    packet.raise_for_error()
  File "E:\anaconda3\lib\site-packages\pymysql\protocol.py", line 221, in raise_for_error
    err.raise_mysql_exception(self._data)
  File "E:\anaconda3\lib\site-packages\pymysql\err.py", line 143, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.NotSupportedError: (1235, 'Oracle tenant for current client driver is not supported')

dreamrise 你好,

我们基于OBserver 2.2.77版本(以及OBServer 2.2.74版本) + OB JDBC 1.1.7版本,分别对Oracle模式和MySQL模式进行测试,结果可连接可执行,以下是测试案例:

import jaydebeapi


def oboracle_test():
    url = 'jdbc:oceanbase://这里是IP:这里是端口/UNITTESTS'
    user = '这里是个账号'
    password = '这里是密码'
    jarFile = 'C:/Users/wgz/PycharmProjects/ob_test/ob_test/oceanbase-client-1.1.7.jar'
    driver = 'com.alipay.oceanbase.jdbc.Driver'

    conn = jaydebeapi.connect(driver, url, [user, password], jarFile)
    curs = conn.cursor()
、
    deleteSql = 'drop table test_python'
    try:
        curs.execute(deleteSql)
    except Exception as e:
        print(e)

    createSql = 'create table test_python (id number , test_varchar varchar2(32))'
    curs.execute(createSql)

    for i in range(10):
        curs.execute("insert into test_python values (0,'oracle_test')")

    querySql = 'select * from test_python'

    curs.execute(querySql)
    result = curs.fetchall()
    print(result)
    curs.close()
    conn.close()

def obmysql_test():
    url = 'jdbc:oceanbase://这里是IP:这里是地址/TEST'
    user = '这是账号'
    password = '这是密码'
    jarFile = 'C:/Users/wgz/PycharmProjects/ob_test/ob_test/oceanbase-client-1.1.7.jar'
    driver = 'com.alipay.oceanbase.jdbc.Driver'

    conn = jaydebeapi.connect(driver, url, [user, password], jarFile)
    curs = conn.cursor()
    deleteSql = 'drop table test_python'
    try:
        curs.execute(deleteSql)
    except Exception as e:
        print()

    createSql = 'create table test_python (id int , test_a varchar(32))'
    curs.execute(createSql)

    for i in range(10):
        curs.execute("insert into test_python values (0,'mysql_test')")

    querySql = 'select * from test_python'

    curs.execute(querySql)
    result = curs.fetchall()
    print(result)
    curs.close()
    conn.close()


oboracle_test()
obmysql_test()

结果如下:

我是驱动和中间件的产品经理,如果你在使用Python通过jdbc访问OB过程中依旧有问题,或者其他问题,可以让项目中的OceanBase同学联系我,拉个群,我们进行沟通。

你好,我们环境下使用有问题,能否告知下花名或者其余方式。

请钉钉社区群里 @庆涛 ,我拉群分析你的问题。

The server time_zone 'GMT+8:00' defined in the 'serverTimezone' parameter cannot be parsed by java TimeZone implementation. See java.util.TimeZone#getAvailableIDs() for available TimeZone, depending on your JRE implementation.

本机是没有报错,但是部署到linux主机上后,就报这个错误

我这不是写个教程给大家看么. 关键的是,你们应该提供官方的纯正驱动库了,而不是基于JDBC驱动,这个驱动用jaydebeapi有很多BUG.

这篇帖子好实用!

帖子收藏了!

你好,我在测试的时候发现在定义jar文件路径的时候
如果写成和上面你定义的类似的绝对路径

jarFile = "E:/projects/oceanbase-client-x.x.x.jar"

会无法连接,报下面的错

Class com.alipay.oceanbase.jdbc.Driver is not found

只有把jar文件放在运行的工作路径下,然后定义

jarFile = 'oceanbase-client-x.x.x.jar'

才可以连接成功。
这是jar包的问题吗?我在连接别的驱动的时候没有出现过这个问题。


也许是双杠不转义的原因?

1 个赞

感谢回答,不过已经解决了~
是因为路径里面有中文 :sob:,无法识别。全改成英文就可以了~

oracle租户的貌似这种用session不支持?
result = session.query(WF_PROCESS_ACTIVITY_RESPONSES).filter_by(RESPONSE_ID=38253).first()


请问下有遇到过这个错误吗?

还是报找不到驱动的问题,请问还有谁可以联系吗?帮忙看看。python用的3.6

连接信息:


报错信息:

报错提示:java.lang.NoClassDefFoundError: java.lang.NoClassDefFoundError: com/alipay/oceanbase/jdbc/Driver