Python开发

python jdbc操作数据库

当前项目需要使用国产瀚高数据库该数据库修改了认证方式 python不能直连需要修改so文件,比较麻烦,所以这里采用java jdbc方式连接。

环境准备:

1、JDK >= 1.8 并配置环境变量 JAVA_HOME

2、JPype1版本要在1.1.1及以上

pip install JPype1 >= 1.1.1

准备数据库Jdbc的jar包:hgdb-jdbc42-6.0.5.jar

# encoding: utf-8
import jpype.imports
from jpype import JInt, JShort
from jpype import dbapi2
# 配置数据库jar包路径
jpype.startJVM(classpath=['hgdb-jdbc42-6.0.5.jar'])
# 导入数据Driver
from com.highgo.jdbc import *

# 配置jdbc连接地址
conn_url = "jdbc:highgo://IP地址:端口号/数据库"

# 数据库连接用户名密码
driver_args = {
    "user": "xxx",
    "password": "xxx"
}

# 组装
conn = dbapi2.connect(conn_url, driver="com.highgo.jdbc.Driver", driver_args=driver_args)
# 指定jdbc返回结果字段对应数据类型转换
conn.converters[JInt] = str
conn.converters[JShort] = str
# 获取连接游标
cur = conn.cursor()
# 执行查询
cur.execute("SELECT * FROM table1 WHERE org_code = ?", ("参数",))
res = cur.fetchone()
# 直接打印结果
print(res)
# 结果已字典形式输出
columns = [column[0] for column in cur.description]
dict_res = dict(zip(columns, res))
print(dict_res)

trino jdbc连接

# encoding: utf-8
try:
    import jpype.imports
    from jpype import JInt, JShort, JClass
    from jpype import dbapi2
    # 配置数据库jar包路径
    jpype.startJVM(classpath=['trino-jdbc-384.jar'])
    # 导入数据Driver
    importlib.invalidate_caches()
    # from io.trino.jdbc import TrinoDriver
    JClass('io.trino.jdbc.TrinoDriver')
    if jpype.__version__ < '1.1.0':
        raise EnvironmentError('jpype1 need version >= 1.1.0, please check jpype1 version')
except ImportError:
    raise ImportError('import jpype occurred an error')

# 配置jdbc连接地址
conn_url = "jdbc:trino://host:port/catalog"

# 数据库连接用户名密码
driver_args = {
    "user": "admin"
}

# 组装
conn = dbapi2.connect(conn_url, driver="io.trino.jdbc.TrinoDriver", driver_args=driver_args, catalog='hive')
# 指定jdbc返回结果字段对应数据类型转换
conn.converters[JInt] = str
conn.converters[JShort] = str
# 获取连接游标
cur = conn.cursor()
# 执行查询
cur.execute("SELECT * FROM xxxx WHERE date_str = ?", ("xxx",))
res = cur.fetchone()
# 直接打印结果
print(res)
# 结果已字典形式输出
columns = [column[0] for column in cur.description]
dict_res = dict(zip(columns, res))
print(dict_res)

这里需要注意 trino的Driver路径是以io开头,这里与python自带io库重名,直接from形式导入会报错,需要改用JClass(‘io.trino.jdbc.TrinoDriver’)的形式。