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言語の使い方を知る必要があります.
  • 新規データベース: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];
  • Order By:
  • 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;
    
  • Having:
  • 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
  • Like:スで始まる:“%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....  
    ];
    
  • 別名:As可列、表に別名を追加
  • インデックス:
  • 単列索引: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);
  • ユニオン:2つの結合の表は同じ列が必要で、重量除去
  • ユニオンall:二つの結合の表は同じ列が必要で、重さを取りに行かない
  • アルター
  •   ALTER TABLEALTER 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 NULLALTER TABLE table_name MODIFY column_name datatype NOT NULL;
    
    ALTER TABLE      ADD UNIQUE CONSTRAINTALTER TABLE table_name
    ADD CONSTRAINT MyUniqueConstraint UNIQUE(column1, column2...);
    
    ALTER TABLE “    ”              :
    ALTER TABLE table_name
    ADD CONSTRAINT MyUniqueConstraint CHECK (CONDITION);
    
    ALTER TABLE    ADD PRIMARY KEYALTER 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;
    
  • カットオフ表:TRUNCATE TABLEテーブル_name
  • 事務:
  • ロック:LOCK[TABLE]name IN lock_mode;
  • ロック(u)modeは、ACCESS SHAREROW SHAREROW EXCLUSIVESHARE UPDATE EXCLUSIVESHARESHARE ROW EXCLUSIVEEXCLUSIVEACCESS EXCLUSIVE( )を含む.
  • 自動増分:serial
  • 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データベースの提供は簡単です.以下は簡単な例です.
    例を見る前に、表の構造を見てみます.
  • t_msg(メッセージ通知)
  • Field
    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)count
    var 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()関数がデータベースをオフにする必要があり、書き込みができない場合があります.