如何使用PyHDB连接到SAP Hana Express

如何使用PyHDB连接到SAP Hana Express

问题描述:

我有以下Python代码[pyhdb]连接到SAP Hana Express: 我的代码中是否有错误?或者它与SYSTEM用户有关系吗?如何使用PyHDB连接到SAP Hana Express

错误消息是: 无法在架构APP找到表/视图TABLE:1栏19(在pos 18)

import os 
import random 
import platform 
from constant import * 
import pyhdb 

def is_rpi(): 
    return 'arm' in platform.uname()[4] 

if is_rpi(): 
    import Adafruit_DHT 

def read_dht(): 
    if is_rpi(): 
    sensor = Adafruit_DHT.DHT22 
    humidity, temperature = Adafruit_DHT.read_retry(sensor, DHT_PIN) 

    if humidity is not None and temperature is not None: 
     print('Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(temperature, humidity)) 
     return int(humidity), int(temperature) 
    else: 
     return None, None 
else: 
    return random.randint(20, 30), random.randint(40, 70) 

if __name__ == '__main__': 

connection = pyhdb.connect(host=SAP_HOST, port=39015, user=SAP_USER, password=SAP_PWD) 
cursor = connection.cursor() 

temp, humi = read_dht() 
query = "INSERT INTO \"{}\".\"{}\" VALUES(\'{}\', {}, {}, \'{}\')".format(
    SAP_SCHEMA, SAP_TABLE, DEVICE_ID, temp, humi, ROOM_NAME) 
print("Executing query: "), query 
cursor.execute(query) 

print("New Row count: "), cursor.rowcount 
connection.close() 

线这里是恒定的代码:

DHT_PIN = 4 
DEVICE_ID = '0ada9de4-bc4f-4e53-990a-cbcfccaed4c4' 
ROOM_NAME = 'room 101 
SAP_HOST = 'hxehost' 
SAP_USER = 'SYSTEM' 
SAP_PWD = 'XXXXXXXXXXXX' 
SAP_SCHEMA = 'APP' 
SAP_TABLE = 'TABLE' 
+0

这是一个数据库问题:问题是,模式APP是否包含名为TABLE的表或视图,如果是,SAP_USER是否有权查看它? – snakecharmerb

+0

如何检查用户是否有权查看它? – fiberhead

错误消息

在架构APP中找不到表/视图APP

指出该表不存在的事实。为了检查表是否是已知的系统你可以,例如,同时运行SQL语句

SELECT * FROM TABLES WHERE SCHEMA_NAME='APP' AND TABLE_NAME='TABLE';

这将导致对一个不存在的表中设置一个空的结果。

在授权问题的情况下,你可能还是期待像

特权不足的错误:未授权

对于有关检查权限的问题,你可能想看看进入系统视图分别为EFFECTIVE_PRIVILEGESEFFECTIVE_ROLESGRANTED_PRIVILEGESGRANTED_ROLES(请参阅SAP HANA安全指南)。通常,可以由用户或角色授予权限。角色可以包含其他角色,这可能会使授权更加复杂。

然而,在特定情况下,你也许可以尝试的,而简单的SQL查询:(根据您的情况,您可能还需要检查是否有UPDATE特权)

SELECT * FROM "PUBLIC"."EFFECTIVE_PRIVILEGES" 
WHERE USER_NAME='SYSTEM' AND SCHEMA_NAME='APP' AND PRIVILEGE='INSERT'; 

请允许我添加这样一句话:示例中的INSERT声明可能需要明确承诺有效,因为默认情况下,如果我没有记错,连接将设置为autocommit=False

用户系统没有足够的权限插入到表中。解决感谢大家。