goにPostgreSQLを使う
32816 ワード
記事の目次goにPostgreSQL 1.PostgreSQL 2.PostgreSQLに関する操作 3.データベースドライバ 4.go操作データベース (1)データベースを開く (2)照会 (3)挿入 (4)更新 (5)削除 (6)count 5.その他 goにPostgreSQLを使う
1.PostgreSQL
バックグラウンドの開発を行う時、避けられないのはデータベースを使うことです.多くのデータベースの中で、PostgreSQLはいい選択です.本人が最初に使ったのはblotdbです.サービス計算の授業で使ったことがあります.これは使いやすいキーの数のデータベースですが、使う過程でキーのデータベースに大きな弊害があります.Blotdbは実は更に検索の多い環境を使って、頻繁に更新する環境に適しないので、後でblotdbをデータベースとして使うことを放棄しました.
その後、PostgreSQLに変更しました.主にデータベースでこのデータベースを勉強しました.少なくともデータベースの操作部分はすぐに使えます.環境を再配置する必要がありません.一方で、PostgreSQLはMySQLと比較して、Oracleの代わりに設計されたより大きなものである.だから、企業の応用の中でPostgreSQLを採用するのは賢明な選択です.
PostgreSQLは、強力なオープンソースオブジェクト関係データベース管理システム(ORDBMS)です.データを安全に保存するために使用します.最善のやり方をサポートし、要求を処理する時に検索することができます.PostgreSQL(Post-gress-Q-Lともいう)は、PostgreSQLグローバル開発グループ(グローバルボランティアチーム)によって開発されました.それは任意の会社または他の個人エンティティによって制御されません.ソースは無料で提供されます.PostgreSQLはプラットフォームにまたがっています.Linux、FreeBSD、OS X、Solaris、Microsoft Windowsなど、多くのオペレーティングシステムで実行できます.
2.PostgreSQL関連操作
go言語を使ってデータベースを操作する前に、私達は少なくともPostgreSQL言語の使い方を知る必要があります.新規データベース: すべてのデータベースを確認する: すべての表を見る: データベースの切り替え: データベースの削除: 作成表: 削除表: 作成モード: 削除モード: 再帰的削除モード: 挿入データ: 照会文: 更新文: 削除文: Order By: パケット: Having: 照会条件: Like:スで始まる: 内部接続: 外部接続: 外連結は左連結、右連結、全外連結 クロス接続(フォークリフト): 作成図: 削除ビュー: 関数: トリガー 別名:As可列、表に別名を追加 インデックス: 単列索引: 複数列インデックス: 唯一の索引: ユニオン:2つの結合の表は同じ列が必要で、重量除去 ユニオンall:二つの結合の表は同じ列が必要で、重さを取りに行かない アルター カットオフ表:TRUNCATE TABLEテーブル_name 事務: ロック:LOCK[TABLE]name IN lock_mode; ロック(u)modeは、 自動増分:serial 権限:
使用前に、まず関連駆動のインストールが必要です.Go実現にはPostgreSQL対応の駆動も多く、本プロジェクトでは
goデータベースの提供は簡単です.以下は簡単な例です.
例を見る前に、表の構造を見てみます.t_msg(メッセージ通知) Field
Type
キー
Description
msgID
テキスト
PRIMARY KEY
メッセージのID
state
インテグ
メッセージの状態(既読と未読)
receiver
テキスト
FOREGN KEY
メッセージの受け手
時間
テキスト
メッセージの時間
title
テキスト
メッセージのタイトル
content
テキスト
メッセージの内容
(1)データベースを開く
注意すべきは、データベースを操作するたびに呼び出し
1.PostgreSQL
バックグラウンドの開発を行う時、避けられないのはデータベースを使うことです.多くのデータベースの中で、PostgreSQLはいい選択です.本人が最初に使ったのはblotdbです.サービス計算の授業で使ったことがあります.これは使いやすいキーの数のデータベースですが、使う過程でキーのデータベースに大きな弊害があります.Blotdbは実は更に検索の多い環境を使って、頻繁に更新する環境に適しないので、後でblotdbをデータベースとして使うことを放棄しました.
その後、PostgreSQLに変更しました.主にデータベースでこのデータベースを勉強しました.少なくともデータベースの操作部分はすぐに使えます.環境を再配置する必要がありません.一方で、PostgreSQLはMySQLと比較して、Oracleの代わりに設計されたより大きなものである.だから、企業の応用の中でPostgreSQLを採用するのは賢明な選択です.
PostgreSQLは、強力なオープンソースオブジェクト関係データベース管理システム(ORDBMS)です.データを安全に保存するために使用します.最善のやり方をサポートし、要求を処理する時に検索することができます.PostgreSQL(Post-gress-Q-Lともいう)は、PostgreSQLグローバル開発グループ(グローバルボランティアチーム)によって開発されました.それは任意の会社または他の個人エンティティによって制御されません.ソースは無料で提供されます.PostgreSQLはプラットフォームにまたがっています.Linux、FreeBSD、OS X、Solaris、Microsoft Windowsなど、多くのオペレーティングシステムで実行できます.
2.PostgreSQL関連操作
go言語を使ってデータベースを操作する前に、私達は少なくともPostgreSQL言語の使い方を知る必要があります.
create database testdb
;\l
\d
\c testdb
;drop database testdb
;CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
PRIMARY KEY( one or more columns ) );
drop table table_name
;create schema schema_name
;drop schema schema_name
;drop schema schema_name cascade
;INSERT INTO TABLE_NAME (column1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN)
;複数の値を同時に挿入できるSELECT ID, NAME, AGE, SALARY FROM EMPLOYEES WHERE [condition]
;UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN WHERE [condition]
;DELETE FROM table_name WHERE [condition]
;SELECT column-list
FROM table_name
[WHERE condition]
ORDER BY column1, column2, .. columnN [ASC | DESC];
SELECT column-list
FROM table_name
WHERE [conditions ]
GROUP BY column1, column2....columnN [ORDER BY column1, column2....columnN]
eg:select name,sum(id) from student group by name;
SELECT column-list
FROM table_name
WHERE [conditions ]
GROUP BY column1, column2....columnN
Having [ conditions ]
[ORDER BY column1, column2....columnN]
And、Or、Not、Like、In、Not In、Between
“%su”
SELECT table1.columns, table2.columns
FROM table1 INNER JOIN table2
ON table1.common_filed = table2.common_field;
SELECT table1.columns, table2.columns
FROM table1 LEFT OUTER JOIN table2
ON table1.common_filed = table2.common_field;
SELECT coloums FROM table1 CROSS JOIN table2
CREATE [TEMP | TEMPORARY] VIEW view_name
AS SELECT column1, column2..... FROM table_name
WHERE [condition];
DROP VIEW view_name
;CREATE [OR REPLACE] FUNCTION function_name (arguments)
RETURNS return_datatype AS $variable_name$
DECLARE
declaration;
[...]
BEGIN
< function_body >
[...]
RETURN { variable_name | value }
END; LANGUAGE plpgsql;
--example
CREATE OR REPLACE FUNCTION totalRecords ()
RETURNS integer AS $total$
declare
total integer;
BEGIN
SELECT count(*) into total FROM EMPLOYEES;
RETURN total;
END;
$total$ LANGUAGE plpgsql;
--
select totalRecords();
CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
-- Trigger logic goes here....
];
CREATE INDEX index_name ON table_name (column_name)
;CREATE INDEX index_name ON table_name (column1_name, column2_name)
;CREATE UNIQUE INDEX index_name on table_name (column_name)
; ALTER TABLE :
ALTER TABLE table_name ADD column_name datatype;
ALTER TABLE DROP COLUMN( ) :
ALTER TABLE table_name DROP COLUMN column_name;
ALTER TABLE DATA TYPE( ) :
ALTER TABLE table_name ALTER COLUMN column_name TYPE datatype;
ALTER TABLE NOT NULL :
ALTER TABLE table_name MODIFY column_name datatype NOT NULL;
ALTER TABLE ADD UNIQUE CONSTRAINT :
ALTER TABLE table_name
ADD CONSTRAINT MyUniqueConstraint UNIQUE(column1, column2...);
ALTER TABLE “ ” :
ALTER TABLE table_name
ADD CONSTRAINT MyUniqueConstraint CHECK (CONDITION);
ALTER TABLE ADD PRIMARY KEY :
ALTER TABLE table_name
ADD CONSTRAINT MyPrimaryKey PRIMARY KEY (column1, column2...);
ALTER TABLE (DROP CONSTRAINT) :
ALTER TABLE table_name
DROP CONSTRAINT MyUniqueConstraint;
ALTER TABLE (DROP PRIMARY KEY) :
ALTER TABLE table_name
DROP CONSTRAINT MyPrimaryKey;
ACCESS SHARE
、ROW SHARE
、ROW EXCLUSIVE
、SHARE UPDATE EXCLUSIVE
、SHARE
、SHARE ROW EXCLUSIVE
、EXCLUSIVE
、ACCESS EXCLUSIVE( )
を含む.CREATE TABLE tablename (
colname SERIAL
);
--Grant
GRANT privilege [, ...]
ON object [, ...]
TO { PUBLIC | GROUP group | username }
--Revoke
REVOKE privilege [, ...]
ON object [, ...]
FROM { PUBLIC | GROUP groupname | username }
3.データベースドライバ使用前に、まず関連駆動のインストールが必要です.Go実現にはPostgreSQL対応の駆動も多く、本プロジェクトでは
"github.com/lib/pq"
使用前に端末で以下のコマンドを実行する必要があります.go get -u "github.com/lib/pq"
go get -u "database/sql"
4.go操作データベースgoデータベースの提供は簡単です.以下は簡単な例です.
例を見る前に、表の構造を見てみます.
Type
キー
Description
msgID
テキスト
PRIMARY KEY
メッセージのID
state
インテグ
メッセージの状態(既読と未読)
receiver
テキスト
FOREGN KEY
メッセージの受け手
時間
テキスト
メッセージの時間
title
テキスト
メッセージのタイトル
content
テキスト
メッセージの内容
(1)データベースを開く
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%ssslmode=disable",yourHost, yourPort, yourUser, yourPassword, yourDbname)
db, err := sql.Open("postgres", psqlInfo)
(2)クエリーrows, err := db.Query("select * from t_msg where receiver=$1", userID)
for rows.Next() {
messageObj := models.Message{}
err = rows.Scan(&messageObj.MsgID, &messageObj.State, &messageObj.Receiver, &messageObj.Time, &messageObj.Title, &messageObj.Content)
if err != nil {
fmt.Printf("could not find message, %v", err)
db.Close()
return nil, false
}
messages = append(messages, messageObj)
}
db.Close()
(3)挿入stmt, err := db.Prepare("insert into t_msg (msgID, state, receiver, time, title, content) values($1, $2, $3, $4, $5, $6)")
if err != nil {
fmt.Printf("could not Insert Mesage, %v", err)
ok = false
}
_, err = stmt.Exec(message.MsgID, message.State, message.Receiver, message.Time, message.Title, message.Content)
if err != nil {
fmt.Printf("could not insert mesage, %v", err)
ok = false
}
db.Close()
(4)更新stmt, err := db.Prepare("update t_msg set state=$1 WHERE msgID=$2 and receiver=$3")
if err != nil {
fmt.Println("fail to update:%v", err)
ok = false
}
_, err = stmt.Exec(state, messageID, userID)
if err != nil {
fmt.Println(err)
ok = false
}
db.Close()
(5)削除stmt, err := db.Prepare("delete from t_msg where msgID=$1 and receiver=$2")
if err != nil {
fmt.Println("delete error: %v", err)
ok = false
}
_, err = stmt.Exec(messageID, userID)
if err != nil {
ok = false
fmt.Println("delete error: %v", err)
}
db.Close()
(6)countvar count int64
err = db.QueryRow("select count(*) from t_msg where msgID=$1", id).Scan(&count)
ok = true
if err != nil || count == 0 {
fmt.Printf("could not query, %v", err)
ok = false
}
db.Close()
5.その他注意すべきは、データベースを操作するたびに呼び出し
db.Close()
関数がデータベースをオフにする必要があり、書き込みができない場合があります.