Interface for GoLang to DB2 for z/OS
, DB2 for LUW
and DB2 for i
database servers.
For complete list of go_ibm_db APIs and examples please check APIDocumentation.md
-
Golang should be installed(Golang version should be >=1.12.x and <= 1.21.X)
-
Git should be installed in your system.
-
For non-windows users, GCC and tar should be present in your system.
-
For Docker Linux Container(Ex: Amazon Linux2), use below commands:
yum install go git tar libpam
-
Environment variable
DB2HOME
is changed toIBM_DB_HOME
. -
SQL1598N Error - It is expected in absence of valid db2connect license. Please click here and read instructions about license requirement and how to apply the license.
- You may install go_ibm_db using either of below commands
go get -d github.com/ibmdb/go_ibm_db
go install github.com/ibmdb/go_ibm_db/installer@latest
go install github.com/ibmdb/go_ibm_db/[email protected]
- You can optionally specify a specific cli driver by setting the IBM_DB_DOWNLOAD_URL environment variable to the full path of your desired cli driver. For example, if you want to install the 64-bit macos v11.5.4 cli driver instead of the latest one, set the variable as below:
export IBM_DB_DOWNLOAD_URL=https://public.dhe.ibm.com/ibmdl/export/pub/software/data/db2/drivers/odbc_cli/v11.5.4/macos64_odbc_cli.tar.gz
-
If you already have a clidriver available in your system, add the path of the same to your PATH windows environment variable. Example:
set PATH = "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin";%PATH%
-
If you do not have a clidriver in your system, go to installer folder where
go_ibm_db
is downloaded in your system, use below command: (Example: C:\Users\uname\go\src\github.com\ibmdb\go_ibm_db\installer or C:\Users\uname\go\pkg\mod\github.com\ibmdb\go_ibm_db\installer where uname is the username ) and run setup.go file (go run setup.go
).
Set IBM_DB_HOME to clidriver downloaded path and
set this path to your PATH windows environment variable
(Example: Path=C:\Users\uname\go\src\github.com\ibmdb\clidriver)
set IBM_DB_HOME=C:\Users\uname\go\src\github.com\ibmdb\clidriver
set PATH=%PATH%;C:\Users\uname\go\src\github.com\ibmdb\clidriver\bin
or
set PATH=%PATH%;%IBM_DB_HOME%\bin
- Script file to set environment variable
cd .../go_ibm_db/installer
setenvwin.bat
- You may install go_ibm_db using either of below commands
go get -d github.com/ibmdb/go_ibm_db
go install github.com/ibmdb/go_ibm_db/installer@latest
go install github.com/ibmdb/go_ibm_db/[email protected]
- You can optionally specify a specific cli driver by setting the IBM_DB_DOWNLOAD_URL environment variable to the full path of your desired driver. For example, if you want to install the 64-bit macos v11.5.4 cli driver instead of the latest one, set the variable as below:
export IBM_DB_DOWNLOAD_URL=https://public.dhe.ibm.com/ibmdl/export/pub/software/data/db2/drivers/odbc_cli/v11.5.4/macos64_odbc_cli.tar.gz
- If you already have a clidriver available in your system, set the below environment variables with the clidriver path
export IBM_DB_HOME=/home/uname/clidriver
export CGO_CFLAGS=-I$IBM_DB_HOME/include
export CGO_LDFLAGS=-L$IBM_DB_HOME/lib
Linux:
export LD_LIBRARY_PATH=/home/uname/clidriver/lib
or
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$IBM_DB_HOME/lib
Mac:
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/Applications/clidriver/lib
- If you do not have a clidriver available in your system, use below commands.
(Example: /home/uname/go/src/github.com/ibmdb/go_ibm_db/installer
or /home/uname/go/pkg/mod/github.com/ibmdb/go_ibm_db/installer
where uname is the username) and run setup.go file (
go run setup.go
)
export IBM_DB_HOME=/home/uname/go/src/github.com/ibmdb/clidriver
export CGO_CFLAGS=-I$IBM_DB_HOME/include
export CGO_LDFLAGS=-L$IBM_DB_HOME/lib
Linux:
export LD_LIBRARY_PATH=/home/uname/go/src/github.com/ibmdb/clidriver/lib
or
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$IBM_DB_HOME/lib
Mac:
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/home/uname/go/src/github.com/ibmdb/clidriver/lib
or
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$IBM_DB_HOME/lib
- Script file to set environment variables in Linux/Mac
cd .../go_ibm_db/installer
source setenv.sh
- For Docker Linux Container, use below commands:
yum install -y gcc git go wget tar xz make gcc-c++
cd /root
curl -OL https://golang.org/dl/go1.21.4.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.21.4.linux-amd64.tar.gz
rm /usr/bin/go
rm /usr/bin/gofmt
cp /usr/local/go/bin/go /usr/bin/
cp /usr/local/go/bin/gofmt /usr/bin/
go install github.com/ibmdb/go_ibm_db/[email protected]
or
go install github.com/ibmdb/go_ibm_db/installer@latest
-
Connection to
Db2 for z/OS
orDb2 for i
(AS400) Server usingibm_db
driver from distributed platforms (Linux, Unix, Windows and MacOS) is not free. It requires either client side or server side license. -
Connection to
Db2 for LUW
orInformix
Server usingibm_db
driver is free. -
ibm_db
returns SQL1598N error in absence of a valid db2connect license. SQL1598N error is returned by the Db2 Server to client. To suppress this error, Db2 server must be activated with db2connectactivate utility OR a client side db2connect license file must exist. -
Db2connect license can be applied on database server or client side. A db2connect license of version 11.5 is required for ibm_db.
-
For activating server side license, you can purchase either
Db2 Connect Unlimited Edition for System zĀ®
orDb2 Connect Unlimited Edition for System iĀ®
license from IBM. -
Ask your DBA to run db2connectactivate utility on Server to activate db2connect license.
-
If database Server is enabled for db2connect, no need to apply client side db2connect license.
-
If Db2 Server is not db2connectactivated to accept unlimited number of client connection, you must need to apply client side db2connect license.
-
db2connectactivate utility and client side db2connect license both comes together from IBM in a single zip file.
-
Client side db2connect license is a
db2con*.lic
file that must be copied underclidriver\license
directory. -
If you have a
db2jcc_license_cisuz.jar
file, it will not work for ibm_db.db2jcc_license_cisuz.jar
is a db2connect license file for Java Driver. For non-Java Driver, client side db2connect license comes as a file namedb2con*.lic
. -
If environment variable
IBM_DB_HOME
orIBM_DB_INSTALLER_URL
is not set,ibm_db
automatically downloads open source driver specific clidriver and save asgithub.com/ibmdb/clidriver
. Ignores any other installation. -
If
IBM_DB_HOME
orIBM_DB_INSTALLER_URL
is set, you need to have same version of db2connect license as installed db2 client. Check db2 client version usingdb2level
command to know version of db2connect license required. The license file should get copied under$IBM_DB_HOME\license
directory. -
If you do not have db2connect license, contact IBM Customer Support to buy db2connect license. Find the
db2con*.lic
file in the db2connect license shared by IBM and copy it under.../github.com/ibmdb/clidriver/license
directory or$IBM_DB_HOME/license
directory ifIBM_DB_HOME
is set. -
To know more about license and purchasing cost, please contact IBM Customer Support.
-
To know more about server based licensing viz db2connectactivate, follow below links:
- Activating the license certificate file for Db2 Connect Unlimited Edition.
- Unlimited licensing using db2connectactivate utility.
package main
import (
"database/sql"
"fmt"
_ "github.com/ibmdb/go_ibm_db"
)
func main() {
con := "HOSTNAME=host;DATABASE=name;PORT=number;UID=username;PWD=password"
db, err := sql.Open("go_ibm_db", con)
if err != nil {
fmt.Println(err)
}
db.Close()
}
To run the sample:- go run example1.go
For complete list of connection parameters please check this.
package main
import (
"database/sql"
"fmt"
_ "github.com/ibmdb/go_ibm_db"
)
func Create_Con(con string) *sql.DB {
db, err := sql.Open("go_ibm_db", con)
if err != nil {
fmt.Println(err)
return nil
}
return db
}
// Creating a table.
func create(db *sql.DB) error {
_, err := db.Exec("DROP table SAMPLE")
if err != nil {
_, err := db.Exec("create table SAMPLE(ID varchar(20),NAME varchar(20),LOCATION varchar(20),POSITION varchar(20))")
if err != nil {
return err
}
} else {
_, err := db.Exec("create table SAMPLE(ID varchar(20),NAME varchar(20),LOCATION varchar(20),POSITION varchar(20))")
if err != nil {
return err
}
}
fmt.Println("TABLE CREATED")
return nil
}
// Inserting row.
func insert(db *sql.DB) error {
st, err := db.Prepare("Insert into SAMPLE(ID,NAME,LOCATION,POSITION) values('3242','mike','hyd','manager')")
if err != nil {
return err
}
st.Query()
return nil
}
// This API selects the data from the table and prints it.
func display(db *sql.DB) error {
st, err := db.Prepare("select * from SAMPLE")
if err != nil {
return err
}
err = execquery(st)
if err != nil {
return err
}
return nil
}
func execquery(st *sql.Stmt) error {
rows, err := st.Query()
if err != nil {
return err
}
cols, _ := rows.Columns()
fmt.Printf("%s %s %s %s\n", cols[0], cols[1], cols[2], cols[3])
fmt.Println("-------------------------------------")
defer rows.Close()
for rows.Next() {
var t, x, m, n string
err = rows.Scan(&t, &x, &m, &n)
if err != nil {
return err
}
fmt.Printf("%v %v %v %v\n", t, x, m, n)
}
return nil
}
func main() {
con := "HOSTNAME=host;DATABASE=name;PORT=number;UID=username;PWD=password"
type Db *sql.DB
var re Db
re = Create_Con(con)
err := create(re)
if err != nil {
fmt.Println(err)
}
err = insert(re)
if err != nil {
fmt.Println(err)
}
err = display(re)
if err != nil {
fmt.Println(err)
}
}
To run the sample:- go run example2.go
package main
import (
_ "database/sql"
"fmt"
a "github.com/ibmdb/go_ibm_db"
)
func main() {
con := "HOSTNAME=host;PORT=number;DATABASE=name;UID=username;PWD=password"
pool := a.Pconnect("PoolSize=100")
// SetConnMaxLifetime will take the value in SECONDS
db := pool.Open(con, "SetConnMaxLifetime=30")
st, err := db.Prepare("Insert into SAMPLE values('hi','hi','hi','hi')")
if err != nil {
fmt.Println(err)
}
st.Query()
// Here the time out is default.
db1 := pool.Open(con)
st1, err := db1.Prepare("Insert into SAMPLE values('hi1','hi1','hi1','hi1')")
if err != nil {
fmt.Println(err)
}
st1.Query()
db1.Close()
db.Close()
pool.Release()
fmt.println("success")
}
To run the sample:- go run example3.go
package main
import (
"database/sql"
"fmt"
"time"
a "github.com/ibmdb/go_ibm_db"
)
func ExecQuery(st *sql.Stmt) error {
res, err := st.Query()
if err != nil {
fmt.Println(err)
}
cols, _ := res.Columns()
fmt.Printf("%s %s %s %s\n", cols[0], cols[1], cols[2], cols[3])
defer res.Close()
for res.Next() {
var t, x, m, n string
err = res.Scan(&t, &x, &m, &n)
fmt.Printf("%v %v %v %v\n", t, x, m, n)
}
return nil
}
func main() {
con := "HOSTNAME=host;PORT=number;DATABASE=name;UID=username;PWD=password"
pool := a.Pconnect("PoolSize=5")
ret := pool.Init(5, con)
if ret != true {
fmt.Println("Pool initializtion failed")
}
for i:=0; i<20; i++ {
db1 := pool.Open(con, "SetConnMaxLifetime=10")
if db1 != nil {
st1, err1 := db1.Prepare("select * from VMSAMPLE")
if err1 != nil {
fmt.Println("err1 : ", err1)
}else{
go func() {
execquery(st1)
db1.Close()
}()
}
}
}
time.Sleep(30*time.Second)
pool.Release()
}
To run the sample:- go run example4.go
- Connection information must be specified in the environment variables
For example, by sourcing the following ENV variables:
export DB2_DATABASE=<Database Name>
export DB2_USER=<Username>
export DB2_PASSWD=<Password>
export DB2_HOSTNAME=<Hostname or IP>
export DB2_PORT=<Database Port>
- OR
If not using environment variables, update connection information in
go_ibm_db/testdata/config.json file.
-
Now run go test command (use go test -v command for details)
-
To run a particular test case (use "go test sample_test.go main.go", example "go test Arraystring_test.go main.go")