2016-02-12 65 views
3

我想知道我可以如何讓我的數組varchar在我的psql數據庫中的數組字符串中去呈現它在json中。數組Varchar(psql)數組字符串(golang)

我真的這樣做

在創造我的表的創建我列這樣的:

tags varchar(50)[] default NULL 

當我使用我的選擇請求得到它在golang:

var rowtags []uint8 
err = rows.Scan(&rowtags) 
if err != nil { 
    log.Fatal(err) 
} 

我試圖做一個功能,將uint8 []轉換爲字符串[]

func Uint8toString(array []uint8) []string { 

    var ret = make([]string, len(array)) 
    for i := 0; i < len(array); i++{ 
     ret[i] = string(array[i]) 
    } 
    return (ret) 
} 

,所以我申請我的變種rowstag

var tags := Uint8toString(rowtags) 

的功能,當我使結構其中var標籤是,我得到

"Tags": [ 
    "{", 
    "#", 
    "c", 
    ",", 
    "#", 
    "c", 
    ",", 
    "#", 
    "c", 
    "o", 
    "u", 
    "c", 
    "o", 
    "u", 
    ",", 
    "#", 
    "c", 
    "d", 
    "}" 
    ], 
當然

我想它

"Tags": [ 
    "#c", 
    "#c", 
    "#coucou", 
    "#cd" 
    ], 

感謝幫助我,我在短時間內呆在golang,並且找不到解決方案。

回答

0

首先,爲什麼你有一個名爲標籤的列包含多個標籤值?將另一個帶有外鍵的表放到標記列當前所在的位置,這樣每個標記值就是它自己的行不是更好嗎?如果你有,你應該能夠做一些非常簡單,如:

rows := db.QueryRow("SELECT tag from tags_table where foreign_key = 123") 
var asSlice []string 
err := row.Scan(&asSlice) 

如果你必須把它放在一個列的所有內,將有可能只是其存儲爲JSON?然後,你可以使用「編碼/ JSON」包不喜歡簡單的東西:

func Uint8toString(array []uint8) []string { 
    var stringArray []string 
    json.Unmarshal(array, &stringArray) 
    return stringArray 
} 

雖然我認爲你應該重新考慮要實現上述標籤欄的方式,你也可以使用下面的邏輯來解析成字符串,但是它假定格式都是類似於您發佈的內容:

func Uint8toString(array []uint8) []string { 
    stringNoBrackets := string(array[1:len(array)-1]) 
    return strings.Split(stringNoBrackets,",") 
} 
+0

是我想太多,我需要重新考慮IM的方式實現標籤欄,但我真的想知道轉換爲varchar數組字符串數組的最佳方式,但感謝你的答案 – Fantasim

+0

在代碼示例底部應該會爲你的結果產生一個字符串數組......可能有一種更簡單的方法,但我不知道你的查詢是什麼樣的,你是否嘗試傳入一個[]字符串的引用而不是對[ ] unit8進入掃描? (見第一個代碼片段)...這仍然可以工作,但不知道你的查詢或表看起來像 –

+0

好吧,我會嘗試,謝謝你 – Fantasim

0

數據庫/ SQL程序包不會將數據讀入一個* []字符串直接的掃描方法。如果您希望在Postgres中存儲字符串數組,請考慮使用數據類型jsonb而不是varchar數組。這將爲您節省將自數據庫返回的[]字節解析回[]字符串的麻煩。

tags jsonb NOT NULL 

要插入值到數據庫中,編碼您[]字符串作爲JSON陣列json.Marshal從編碼/ JSON。

要獲取值,請創建一個新類型,它是實現掃描器接口的[]字符串的別名,稱爲StringSlc。

type StringSlc []string 

// Scan implements the sql.Scanner interface 
func (s *StringSlc) Scan(src interface{}) error { 
    b, ok := src.([]byte) 
    if !ok { 
     return fmt.Errorf("Type assertion .([]byte) failed.") 
    } 
    return json.Unmarshal(b, s) 
} 

用它來掃描,然後轉換爲[]字符串。

var rowtags StringSlc 
err := rows.Scan(&rowtags) 
if err != nil { 
    log.Fatal(err) 
} 
fmt.Println([]string(rowtags))