工作的时候需要往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语句字段设置成变量,然后从另外的文件里读取再插入才算更加偷懒的方式,等以后有时间再做吧