XIKEW.COM - 公读宝典 - Golang 连接 Sap HANA - 公读宝典, - 由于CP没找到Cloud Foundry下NetCore的HANA连接方式,现在需要开发一个中间件来完成数据交互.看了官网的一些资料最终选择了Golang来开发

Golang 连接 Sap HANA
GOLANG SAP HANA 4/23/2020 9:55:11 AM 阅读:6

由于CP没找到Cloud Foundry下NetCore的HANA连接方式,现在需要开发一个中间件来完成数据交互.看了官网的一些资料最终选择了Golang来开发

资料查阅

提前准备

编写一个Hello World

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello World!!")
}

直接推送go项目

# 登录CF
cf login -a https://xxx.xxx.com
Email:xxxx@xxx
Password: ????????

#服务器反馈
Authenticating...
OK

# 推送应用
cf push

#服务器反馈
...
Waiting for app to start..
...
     state     since                  cpu    memory       disk        details
#0   running   2020-04-22T03:22:46Z   0.0%   4.1M of 1G   19M of 1G

SAP CP上应用程序后台日志如果可以看到Hello World!!的输出,就说明部署完成了

推送go打包的应用

需要创建一个Procfilemanifest.yml 与应用同目录 Procfile

web: ./Demo.out

manifest.yml

---
applications:
  - name: gohana
    memory: 1024M
    instances: 1
    path: .
    command: ./Demo.out

再push就可以了

有兴趣的同学可以研究下 https://docs.cloudfoundry.org/buildpacks/

绑定HANA服务

img 开通一个 Schema计划的HANA服务 并且完成绑定实例

注意:如果开通hdi-shared服务,则会没有创建表权限.但是搭配WebIDE可以提高数据库的安全级别 WebIDE的入口在使用账号登陆后的首页 img

使用Go连接HANA

package sap

import (
    "crypto/tls"
    "database/sql"
    "fmt"
    "github.com/SAP/go-hdb/driver"
    "log"
)

const (
    HOST = "HOST"
    PORT = "PORT"
    USERNAME    = "USERNAME"
    PASSWORD    = "PASSWORD"
    SCHEMA      = "SCHEMA"
)

func init() {
    //SAP HANA 必须要求SSL连接数据库, 所以在地址后面要加上"?TLSInsecureSkipVerify"
    db, err := sql.Open(driver.DriverName, fmt.Sprintf("%s://%s:%s@%s:%s", driver.DriverName, USERNAME, PASSWORD, HOST, PORT) + "?TLSInsecureSkipVerify")
    if err != nil {
        log.Fatal(err)
    }
    if err := db.Ping(); err != nil {
        log.Fatal(err)
    }
    fmt.Println("SAP HANA 连接成功!")
    
    //数据库和表关系
    schema := driver.Identifier(SCHEMA)
    table := driver.Identifier("accounts")

    query := fmt.Sprintf("drop table %s.%s", schema, table)
    if _, err := db.Exec(query); err != nil {
        fmt.Println(query, "
", err)
    }
    query = fmt.Sprintf("CREATE TABLE %s.%s (ID INTEGER PRIMARY KEY, USERNAME VARCHAR(50))", schema, table)
    if _, err := db.Exec(query); err != nil {
        log.Fatal(query, "
", err)
    }
    query = fmt.Sprintf("INSERT INTO %s.%s values(1,'MR.XCHAN')", schema, table)
    if _, err := db.Exec(query); err != nil {
        log.Fatal(query, "
", err)
    }
    var id int
    var username string
    res := db.QueryRow(fmt.Sprintf("SELECT * FROM %s.%s LIMIT 1", schema, table))
    res.Scan(&id, &username)
    fmt.Println("id:", id, "username:", username)
}

之后就可以参考Demo打包发布到SAP CP平台上 :)