pyhdb库操作hana数据库

发布时间 2023-06-02 16:32:37作者: 三叶草body

python pyhdb库操作hana数据库

参考文档

1 安装

$ pip install pyhdb

2 快速上手

如果您无法访问SAP HANA服务器,请访问SAP HANA开发中心并选择其中一个选项来获得您自己的试用SAP HANA服务器。

要在hada实例中使用PyHDB,请遵循以下指南。

pyhdb的基本用法对于实现DBAPI 2.0接口(PEP 249)的数据库适配器是通用的。下面的示例显示了使用pyhdb模块是多么容易。

import pyhdb

# 建立连接对象
connection = pyhdb.connect(
    host="example.com",
    port=30015,
    user="user",
    password="secret"
)

# 通过连接对象获取游标对象
cursor = connection.cursor()
# 执行sql
cursor.execute("SELECT 'Hello Python World' FROM DUMMY")
# 获取一条数据
cursor.fetchone()
# (u"Hello Python World",)

# 关闭连接对象
connection.close()
  • 建立数据库连接-connect

    pyhdb中函数connect创建一个新的数据库会话并返回一个新的Connection实例。

    请注意,端口不是您SAP HANA数据库的实例号。SAP HANA的SQL端口由315组成,例如默认实例号00的端口为30015。

    pyhdb目前只支持用户和密码认证方式。

  • 游标对象-cursor
    使用Connection对象的方法cursor创建一个新的cursor对象。该对象能够执行SQL语句,并从数据库中获取结果集的一行或多行。

    # 通过连接对象获取游标对象
    cursor = connection.cursor()
    
    # 执行sql 查询 模式和表名
    cursor.execute("SELECT SCHEMA_NAME, TABLE_NAME FROM TABLES")
    
    # 通过游标 从结果集中获取一条数据
    cursor.fetchone()  # ('SYS', 'DUMMY')
    
    # 通过游标 从结果集中获取指定条数
    cursor.fetchmany(3)  # 获取3条数据
    >> [('SYS', 'DUMMY'), ('SYS', 'PROCEDURE_DATAFLOWS'), ('SYS', 'PROCEDURE_MAPPING')]
    
    # 通过游标 从结果集中获取所有数据
    cursor.fetchall()
    

3 操作数据库

执行sql使用execute方法,该方法执行一句sql;如果要执行多条sql,使用executemany方法。

pramas = ['110', '1', 'abcd', 'hello world']
sql = """replace "SAPHANADB"."ZIMAGE" (MANDT,ID,FILENAME,VALUE) values (:1,:2,:3,:4) WITH PRIMARY KEY;"""
# 执行一条数据
cursor.execute(sql, parameters=params)

# 执行多条数据时,使用executemany方法
pramas_list = [['110', '1', 'abcd', 'hello world'], ['120', '2', 'abcd', 'hello world']]
cursor.executemany(sql, parameters=pramas_list)

3.1 创建表

使用execute方法,您还可以执行DDL语句,如CREATE TABLE

cursor.execute('CREATE TABLE PYHDB_TEST("NAMES" VARCHAR (255) null)')

3.2 插入数据

可以使用INSERT INTODELETE之类的execute方法执行DML语句。游标属性rowcount包含受最后一条语句影响的行数。

# 插入数据
cursor.execute("INSERT INTO PYHDB_TEST VALUES('Hello Python World')")
# :1 :2 :3  传入的参数顺序
pramas = ['110', '1', 'abcd', 'hello world']
cursor.execute("""insert into "SAPHANADB"."ZIMAGE" (MANDT,ID,FILENAME,VALUE) values (:1,:2,:3,:4);""", parameters=params)
# 受影响的行数
cursor.rowcount  # 2

3.3 存在更新,不存在创建

可以使用replaceupsert之类的execute方法执行DML语句。游标属性rowcount包含受最后一条语句影响的行数。

# 存在更新,不存在创建
# :1 :2 :3  传入的参数顺序
pramas = ['110', '1', 'abcd', 'hello world']
sql = """replace "SAPHANADB"."ZIMAGE" (MANDT,ID,FILENAME,VALUE) values (:1,:2,:3,:4) WITH PRIMARY KEY;"""
# 执行一条数据 执行多条数据时,使用executemany方法
cursor.execute(sql, parameters=params)
# 受影响的行数
cursor.rowcount  # 1

3.4 LOBs

LOB可以通过插入或更新语句写入数据库,LOB数据以字符串或LOB实例的形式提供:

from pyhdb import NClob

...
nclob_data = 'hello world'
nclob = NClob(nclob_data)
cursor.execute('update mynclob set nclob_1=:1, nclob_2=:2 where id=:3', [nclob, nclob_data, myid])

目前,lob只能在数据库中写入128k(一个更新或插入语句中提供的全部数据量)以内的大小。这个约束将在PyHDB的下一个版本中被移除。但是,当从数据库读取LOB数据时,此限制不适用。