---
# System prepended metadata

title: Golang 筆記(2)-後端相關操作流程
tags: [Golang]

---

---
tags: Golang
---
# Golang 筆記(2)-後端相關操作流程

### &sect; create一個資料庫 (只有一開始建庫會用到)

* 創建
```
go run .\scripts\artisan.go DB create -e solomo
```

* 刪除
```
go run .\scripts\artisan.go DB drop -e solomo
```

* 一個資料夾是一個資料庫
D:\XinMedia-XinAPI\database\migrations\solomo
D:\XinMedia-XinAPI\database\migrations\member


### &sect; create 該資料庫中的一個table
**1. 用指令產出up and down 檔案**
```
go run .\scripts\artisan.go migration [tableName] -e [dbName]
```
`dbName = member || solomo`


=> 執行後，自動會產出up and down檔案

![](https://i.imgur.com/RQWNgFw.png)

**2. 進到up裡面，編輯完成table欄位 using SQL**

> SQL 建立table 指令參考
    

```
CREATE TABLE `product_classes` (
    `id` int NOT NULL AUTO_INCREMENT,
    `product_class_description` VARCHAR(15),
    `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY(`id`)
)
```
[SQL 基本語法補充資料](https://hackmd.io/@irishoho/H1yS2xrVI)


### &sect; 執行migrate up (or down)

`artisan migrate up -e [dbName]`

>`go run .\scripts\artisan.go migrate up -e solomo`

`artisan migrate down -e [dbName]`

* 以dbName為單位，自動偵測尚未建立的up，跑一遍
* down 會回復一步

=> DB中會生成一個新的table

----

### &sect; 建立models (go與資料庫溝通的規則)
**1. 執行 artisan model指令**

```
go run .\scripts\artisan.go model [modelName] -e [dbName]
```

**2. 產出成果放在 app/http/models**
> 只是空殼檔一個，需要自己定義

![](https://i.imgur.com/X23FVYj.png)

![](https://i.imgur.com/VBdfvWd.png)


**3. 自己定義 struct**

| 名稱 |型別(go) | json檔顯示名稱 |db對應名稱|
| -------- | -------- | -------- |  -------- |
|UserName | string  | json:"user_name"   | user_name|

```
type User struct {
	ID        uuid.UUID `json:"id" db:"id"`
	UserName  string    `json:"user_name" db:"user_name"`
	PassWord  string    `json:"pass_word" db:"pass_word"`
	CreatedAt time.Time `json:"created_at" db:"created_at"`
	UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
}
```


### &sect; 建立graphql (go與graphql溝通的規則)

### 1. 建立graphql 模板
    在路徑 D:\XinMedia-XinAPI\schemas下建立檔案 order.graphql

####  兩種模板: Query & Mutation 
用意: 
>* Query: get資料用的入口 
>* Mutation: 新增/修改/刪除資料 用的入口
>* 一個專案通常只有這兩個大入口，其他都從這裡延伸

#### **Query (SELECT)**

> * 定義fn
    * 傳入變數: ( id: Int!) !-必填
    * 輸出變數 order
```
extend type Query{
  getOrder(id: int!): order
  //回傳一個結構
  getAllOrder : [order!]!
}
```

>* 定義結構:

```
type order{
 id: Int
 price: Int
 qty: String!
 title
}
```

#### **Mutation  (INSERT/UPDATE/DELETE)**
* 傳入變數: ( id: Int, price: Int, qty: String!) 
* 輸出變數 order
```
extend type Mutation {
  addOrder( id: Int, price: Int,
 qty: String!): order
}
```


補充:
```
scalar Time 
// qgl 擴充的時間戳記
```

### 2. 使用指令產生[name].resolvers.go檔案 

* admin 的schemas用admin
`artican gql admin`

* api 的schemas用api
`artican gql api`

=> 執行完畢，產生檔案在:
`D:\XinMedia-XinAPI\app\graphql\admin\resolvers`

![](https://i.imgur.com/8uyyVFz.png)

只是殼而已!!!
> 這段靠套件翻譯給GOLANG看的
> 每次有修改要重新run一次go

### 3. 依照需求，修改 [name].resolvers.go中的fn

```
func (r *mutationResolver) Hello(ctx context.Context, msg string) (string, error) {
    newOrder := models.Order{Title:title, Qty: qty}  這個models 就是下面定義的
    models_gen.order  這個models_gen是GQL的SCHEMAS
    
    err = db.Create(&newOrder)
    if err != nil{
     return nil, err
    }
    
    return &newOrder, nil
```

* 和http中models檔案深度相關
引用
import (
	"XinAPI/app/http/models" //import package
)
* m := new(models.Order)
找models的Order struct
```
type Order struct {
	ID                 int        `json:"id" db:"id"`
	No                 string     `json:"no" db:"no"`
	Status             int        `j
    }
```
* m.FindBySn(no)  取用 models的Order檔案裡的某個fn


### models裡面的各種fn

* 連接table `pop.Connect("member")`
pop是水牛設定好的fn
```
import (	
	"github.com/gobuffalo/pop"
)
```



----
### 長得很像的schema?

http modules
(後端取得資料用的) 
```
type User struct {
	ID        uuid.UUID `json:"id" db:"id"`
	UserName  string    `json:"user_name" db:"user_name"`
	PassWord  string    `json:"pass_word" db:"pass_word"`
	CreatedAt time.Time `json:"created_at" db:"created_at"`
	UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
}
```


schema/admin
  (graphQL 用的modles_gen.go )
```
extend type Query {
  user(user_name: String): User
}

type User {
  id: ID!
  user_name: String!
}

```





