Python连接SAP HANA数据库插入数据

工作的时候需要往HANA数据库插入一些测试数据,我使用的连接HANA的工具DBeaver又不能像Mysql那样批量执行多条插入语句,就想用python连接HANA往里循环插入数据,由于代码水平有限,尝试了好久才解决,下面记录一下踩坑过程。

一、先尝试连接上HANA,然后进行读的操作
首先需要安装python连接hana的包pyhdb
1.pip install pyhdb -i http://pypi.douban.com/simple/
2.创建连接
import pyhdb

def get_connection():
    conn = pyhdb.connect(
        host="10.33.67.12",
        port=30015,            #多租户的端口需要准确的如30053,
        user="***",
        password="***"
    )
 
    return conn

3.查询数据

def GetDb(conn):
    cursor = conn.cursor()
    cursor.execute('''
    SELECT  * from "_SYS_"."CBI.MT.AL.MHWZ/CVC_TY_ZLTY" where "ZBUSSAREA"='D100000245' and "CALMONTH"='202105';
''')
    results = cursor.fetchall()
    return results
    cursor.close()
    conn.close()
if __name__=='__main__':
    conn = get_connection()
    results = GetDb(conn)
    for result in results:
        print (result)

二、读取操作没问题,下面进行写的操作
1.先是尝试直接把上面的Select语句换成Insert语句,执行也不报错,但是去HANA里查了一下根本没插进去,Insert语句单独拿出来去HANA执行是没问题的,能够写入;

def get_connection():
    conn = pyhdb.connect(
        host="10.33.67.12",
        port=30015,            #多租户的端口需要准确的如30053,
        user="***",
        password="***"
    )
 
    return conn
def WriteDb(conn):
    cursor = conn.cursor()
    cursor.execute('''
    INSERT INTO "_SYS_"."CBI.MT.AL.MHWZ/CVC_TY_ZLTY"(ZBUSSAREA,  ZREGION, "YEAR", CALQUARTER, CALMONTH, ZXSHL_001, ZXSHL_002, ZXSHL_003, ZXSHL_004, UPDATE_TIME) VALUES('D100000245', 'D100004103',  '2021', '20212', '202105', 400000000.0000000000, 350000000.0000000000, 300000000.0000000000, 0.77000000000, '2021-05-13 00:00:00.000');
''')
    results = cursor.fetchall()
    return results
    cursor.close()
    conn.close()
if __name__=='__main__':
    conn = get_connection()
    results = WriteDb(conn)
    for result in results:
        print (result)

后来想到Mysql插入语句是需要commit的,然后就试着在cursor.execute()后面加上cursor.commit(),结果提示没有此方法,但是查了pyhdb的说明,里面介绍的直接执行cursor.execute()就能写,又查了百度发现可以在连接的后面加上autocommit=True自动提交,于是连接数据库那一步改成了

def get_connection():
    conn = pyhdb.connect(
        host="10.33.67.12",
        port=30015,            #多租户的端口需要准确的如30053,
        user="***",
        password="***",
        autocommit=True
    )

然后再次尝试写数据,就可以了
三、单条Insert语句执行成功,那么怎么批量执行呢,废话不多说,直接上代码

# Author:hjs  Time:2021/5/12  21:47
#-*- coding:utf-8 -*-

import pyhdb
import logging
#对基础变量参数化,方便造数据时切换环境和SQL语句
#开发环境
db_user = '****'
db_pass = '****'
db_ip = '****'
db_port = 30047

# #测试环境
# db_user = '****'
# db_pass = '****'
# db_ip = '****'
# db_port = 30047
#连接数据库
path = 'F://pycharmFiles/xmmh_data.txt'#存放SQL的txt文档
def get_connection():
    try:
        conn = pyhdb.connect(host=db_ip,port=db_port,user=db_user,password=db_pass,autocommit=True)
        return conn
    except Exception as e:
        print(e)
        logging.error('数据库连接失败:%s' % e)
        return False


#写入数据到数据库中
def writeDb(conn,sql):
    cursor = conn.cursor()
    try:
        cursor.execute(sql)
        results = cursor.fetchall()
        cursor.rowcount
        print('SQL执行成功')
        return results
    except Exception as e:
        logging.error('数据写入失败:%s' % e)
        print('执行失败的SQL:',sql)


    finally:
        cursor.close()
        conn.close()


if __name__=='__main__':
#从txt文档读取SQL并执行
    with open(path, mode='r', encoding='UTF-8') as f:
        for line in f.readlines():
            sql = line.strip(r'\n')
            f.close()
            results = writeDb(get_connection(), sql)

这中间有一个坑,就是读取txt文档的时候报编码错误,在读取文档里加上encoding='UTF-8’就好了,当然这个编码方式需要根据你文档的编码方式选择,查看编码方式最简单的方法就是用notepad++打开,然后看右下角的编码方式。

至此,我的偷懒之路暂盖一段落,当然这个方案只是最基础的,能把所有SQL语句字段设置成变量,然后从另外的文件里读取再插入才算更加偷懒的方式,等以后有时间再做吧

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值