banner
biuaxia

biuaxia

"万物皆有裂痕,那是光进来的地方。"
github
bilibili
tg_channel

Golangによる達夢データベースアプリケーションの開発

title: Golang による達夢データベースアプリケーションの開発
date: 2022-02-21 14:23:13
toc: true
index_img: https://b3logfile.com/file/2022/02/23a5526744174569ada00a90ca3167f3.png
category:

  • Golang
    tags:
  • Golang
  • 開発
  • 達夢
  • データベース
  • アプリケーション

Go データベースインターフェース#

Go 言語標準ライブラリ database/sql は、データベース操作の標準インターフェースを提供します。DM データベースは GO 1.13 バージョンに基づき、database/sql パッケージのインターフェースを実装することで、開発者に DM データベース操作の Go 言語インターフェースを提供します。

開発環境の構築#

ソフトウェアバージョン
DM データベースDM 8.0 以上のバージョン
GOGo 1.13 Windows-amd 64
LiteIDELiteIDE x20.1、Go 言語開発エディタ
GITGit-2.29.2-64-bit

DM データベースのインストール#

DM データベースのクイックスタートガイドを参照してください。

データベースインストール中に、BOOKSHOPDMHR のサンプルデータベースを作成するオプションを選択してください。以下の図のようになります:

DMHR サンプルデータベース

Go 環境のインストール#

公式サイトからダウンロードして、Go 1.13 Windows-amd 64 インストーラーを入手できます。解凍版もダウンロード可能です。以下の図のようになります:

インストーラー画像

Go 言語エディタ LiteIDE のインストール#

LiteIDE は軽量の Go 言語開発エディタで、LiteIDE インストーラーをダウンロードします。

Git のダウンロードとインストール#

Git をダウンロードしてインストールし、Git を通じてドライバを取得します。

Git のインストール手順は簡単で、【次へ】をクリックし続けるだけです。インストールが完了したら、デスクトップで右クリックし、【Git Bash Here】ボタンを選択すると、以下の図が表示され、インストールが成功したことを示します。

Git インストール成功

DM ドライバパッケージの設定#

  1. DM ドライバパッケージのインストール

提供された DM ドライバパッケージを GOPATH の src ディレクトリに置きます。ドライバパッケージは dmdbms/drivers/go/dm-go-driver.zip にあり、GOPATH のインストールパスの src に解凍します。以下の図のようになります:

dm ドライバパッケージのインストール

  1. 依存パッケージのインストール

必要な Go 依存パッケージは 2 つ、textsnappy です。Git から依存パッケージをローカルにクローンします。デスクトップで右クリックし【Git Bash Here】を選択して Git コマンドラインウィンドウを開き、text と snappy 依存を順にダウンロードします。

git clone https://github.com/golang/text.git  D:/Go/src/golang.org/x/text
git clone https://github.com/golang/snappy  D:/Go/src/github.com/golang/snappy

注意サンプルのインストールパスは D:/Go ですので、自分のインストールパスに変更してください。

依存パッケージのクローン

依存パッケージのクローン

バインド変数と大フィールド操作の例#

LiteIDE エディタを開き、新しいディレクトリを作成し、そのディレクトリ内に TestDemo.go ファイルを新規作成します。

/*この例はデータの挿入、データの変更、データの削除、データのクエリなどの基本操作を実現します。*/
package main

// 関連パッケージをインポート
import (
	"database/sql"
	"dm"
	"fmt"
	"io/ioutil"
	"time"
)

var db *sql.DB
var err error

func main() {
	driverName := "dm"
	dataSourceName := "dm://SYSDBA:SYSDBA@localhost:5236"
	if db, err = connect(driverName, dataSourceName); err != nil {
		fmt.Println(err)
		return
	}
	if err = insertTable(); err != nil {
		fmt.Println(err)
		return
	}
	if err = updateTable(); err != nil {
		fmt.Println(err)
		return
	}
	if err = queryTable(); err != nil {
		fmt.Println(err)
		return
	}
	if err = deleteTable(); err != nil {
		fmt.Println(err)
		return
	}
	if err = disconnect(); err != nil {
		fmt.Println(err)
		return
	}
}

/* データベース接続を作成 */
func connect(driverName string, dataSourceName string) (*sql.DB, error) {
	var db *sql.DB
	var err error
	if db, err = sql.Open(driverName, dataSourceName); err != nil {
		return nil, err
	}
	if err = db.Ping(); err != nil {
		return nil, err
	}
	fmt.Printf("接続成功: \"%s\"。\n", dataSourceName)
	return db, nil
}

/* 製品情報テーブルにデータを挿入 */
func insertTable() error {
	var inFileName = "D:\\三国演義.jpg"
	var sql = `INSERT INTO production.product(name,author,publisher,publishtime,
product_subcategoryid,productno,satetystocklevel,originalprice,nowprice,discount,
description,photo,type,papertotal,wordtotal,sellstarttime,sellendtime)
VALUES(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17);`
	data, err := ioutil.ReadFile(inFileName)
	if err != nil {
		return err
	}
	t1, _ := time.Parse("2006-Jan-02", "2005-Apr-01")
	t2, _ := time.Parse("2006-Jan-02", "2006-Mar-20")
	t3, _ := time.Parse("2006-Jan-02", "1900-Jan-01")
	_, err = db.Exec(sql, "三国演義", "羅貫中", "中華書局", t1, 4, "9787101046126", 10, 19.0000, 15.2000,
		8.0,
		"『三国演義』は中国初の長編章回体小説であり、中国小説が短編から長編に発展した理由は語りに関係しています。",
		data, "25", 943, 93000, t2, t3)
	if err != nil {
		return err
	}
	fmt.Println("insertTable 成功")
	return nil
}

/* 製品情報テーブルのデータを変更 */
func updateTable() error {
	var sql = "UPDATE production.product SET name = :name WHERE productid = 11;"
	if _, err := db.Exec(sql, "三国演義(上)"); err != nil {
		return err
	}
	fmt.Println("updateTable 成功")
	return nil
}

/* 製品情報テーブルをクエリ */
func queryTable() error {
	var productid int
	var name string
	var author string
	var description dm.DmClob
	var photo dm.DmBlob
	var sql = "SELECT productid,name,author,description,photo FROM production.product WHERE productid=11"
	rows, err := db.Query(sql)
	if err != nil {
		return err
	}
	defer rows.Close()
	fmt.Println("queryTable 結果:")
	for rows.Next() {
		if err = rows.Scan(&productid, &name, &author, &description, &photo); err != nil {
			return err
		}
		blobLen, _ := photo.GetLength()
		fmt.Printf("%v %v %v %v %v\n", productid, name, author, description, blobLen)
	}
	return nil
}

/* 製品情報テーブルのデータを削除 */
func deleteTable() error {
	var sql = "DELETE FROM production.product WHERE productid = 12;"
	if _, err := db.Exec(sql); err != nil {
		return err
	}
	fmt.Println("deleteTable 成功")
	return nil
}

/* データベース接続を閉じる */
func disconnect() error {
	if err := db.Close(); err != nil {
		fmt.Printf("db close failed: %s.\n", err)
		return err
	}
	fmt.Println("disconnect 成功")
	return nil
}

注意事前に D:\\三国演義.jpg に挿入する大フィールド画像を準備してください。

【build and run】ボタンをクリックしてコードを実行し、実行結果のスクリーンショットは以下の通りです:

実行後のスクリーンショット

実行後のデータベースのスクリーンショットは以下の図のようになります:

実行後のデータベースのスクリーンショット

参考資料#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。