在HANA上通过Python和JDBC进行数据操作和定义

2020-09-21 22:38发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


具体来说,我想使用Python和/或JDBC在HANA上创建存储过程。

我尝试执行以下简单的DML查询,例如:

更新SYSTEMDB.UNIVERSITY.STUDENT SET SEMESTERS = 6,其中STUDENT_ID = 1 

虽然在从SQL控制台执行上述操作时效果很好,但是从JDBC或Python执行此操作时却收到以下错误:

"功能不受支持:远程数据库对象上不受支持的DML/DDL"

对于定义请求(例如CREATE PROCEDURE),也会发生同样的情况。

这是Python中的一个最小(非)工作示例:

从hdbcli导入dbapi
 导入系统
 连接= dbapi.connect(" 10.11.1.49",39015," SYSTEM"," MyPassword1")
 游标= connection.cursor()
 查询="""
     更新SYSTEMDB.UNIVERSITY.STUDENT SET SEMESTERS = 6其中STUDENT_ID = 1
 ""
 cursor.execute(查询)
 打印(cursor.fetchone())

用户" SYSTEM"对模式" UNIVERSITY"的特权是" CREATE ANY"。

所允许的查询类型是否有限制? 还是我访问表格的方式有问题?

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


具体来说,我想使用Python和/或JDBC在HANA上创建存储过程。

我尝试执行以下简单的DML查询,例如:

更新SYSTEMDB.UNIVERSITY.STUDENT SET SEMESTERS = 6,其中STUDENT_ID = 1 

虽然在从SQL控制台执行上述操作时效果很好,但是从JDBC或Python执行此操作时却收到以下错误:

"功能不受支持:远程数据库对象上不受支持的DML/DDL"

对于定义请求(例如CREATE PROCEDURE),也会发生同样的情况。

这是Python中的一个最小(非)工作示例:

从hdbcli导入dbapi
 导入系统
 连接= dbapi.connect(" 10.11.1.49",39015," SYSTEM"," MyPassword1")
 游标= connection.cursor()
 查询="""
     更新SYSTEMDB.UNIVERSITY.STUDENT SET SEMESTERS = 6其中STUDENT_ID = 1
 ""
 cursor.execute(查询)
 打印(cursor.fetchone())

用户" SYSTEM"对模式" UNIVERSITY"的特权是" CREATE ANY"。

所允许的查询类型是否有限制? 还是我访问表格的方式有问题?

付费偷看设置
发送
4条回答
宇峰Kouji
1楼 · 2020-09-21 23:09.采纳回答

你好帕特里克

调查 dbapi.py 我发现python客户端(hdbcli)不支持"数据库"参数。

它支持的参数列表如下:

参数:
     address:数据库实例的IP地址或主机名
     port:数据库实例的端口号
     用户:用户名
     密码:用户名密码
     autocommit:自动提交模式
     包大小:通信包大小
     userkey:用户存储密钥
     properties:具有特殊属性的其他dict对象
 

您当然可以立即自己找出租户数据库的端口,但是我建议使用其他方法。

使用hdbuserstore设置连接信息,只需在连接参数中引用用户密钥(在JDBC和hdbcli/Python中都是如此)。 例如,我的用户密钥称为hxedev,它指向HXE数据库:

 c:\ Program Files \ SAP \ hdbclient> hdbuserstore列表hxedev
 KEY HXEDEV
   ENV:hxehost:39013
   使用者:devdude
   数据库:HXE
 

在Python代码中,我可以编写:

从hdbcli导入dbapi中的
>>>
 >>> conn = dbapi.connect(key =" HXEDEV")
 >>>光标= conn.cursor()
 >>> cursor.execute('SELECT current_time FROM DUMMY')
 真正
 >>>对于光标中的行:
 ...打印(行)
 ...
 (datetime.time(4,6,22),)
 

使用JDBC,我可以编写:

 connection = DriverManager.getConnection(" jdbc:sap://?key = HXEDEV"); 

仅此而已。 源代码中没有登录数据。

希望有帮助(顺便说一句:它也适用于ODBC连接)。

Lars

代楠1984
2楼-- · 2020-09-21 22:56

我没有找到如何更改搜索路径(您是否知道如何指定python脚本应在其中查找 dbapi.py ?),但是将python文件移动到正确的目录中却可以解决:)

我之前尝试过密钥/用户密钥,但是它不起作用。 现在他们两个都在工作。

感谢您的帮助:-)

渐行渐远_HoldOn
3楼-- · 2020-09-21 23:11

当您连接到SYSTEMDB并将数据存储在此SYSTEMDB中的模式中时,无需在以下位置提供DBNAME: SQL语句。

因此,只需省略" SYSTEMDB"。 语句中的一点点,代码就可以使用JDBC和Python。

作为一般提示:请勿将SYSTEMDB用于您的应用程序数据。 创建一个租户数据库(即使使用HANA Express Edition,也有一个默认的租户数据库)并连接到该租户数据库。

如果您想更多地了解为什么收到该错误消息,建议您阅读SAP HANA中多个数据库容器背后的概念(请参阅 help.sap.com )。

Climb_Ma
4楼-- · 2020-09-21 23:00

Lars Breddemann 您知道我是什么吗 在Python调用中做错了吗? JDBC和Python连接在语义上都相等,所以我一无所知。

我需要设置一些其他参数吗?

一周热门 更多>