2017-11-04 2 views
2

私は1列に約20列あり、行が作成されたときにすべての列を記入する必要はありません。また、SQLクエリの各列のカードコード名とフロントエンドのhttp.post要求には名前を付けたくありません。すべての値はフォームからのものです。マイコード:挿入される値を持つ列名と第二とのいずれか配列からSQLクエリの列名と値を動的に生成する方法は?

var colNames, values []string 

for k, v := range formData { 
    colNames = append(colNames, k) 
    values = append(values, v) 
} 

今は2つの配列を有します。

db.Query("insert into views (?,?,?,?,?,?) values (?,?,?,?,?,?)", colNames..., values...) 

またはこのような:

db.Query("insert into views " + colNames + " values" + values) 

任意の提案を、私はこのような何かをしたいですか? ありがとう!

+0

MySQLを使用している:


は、代わりにこのような何かを? – mkopriva

+0

はい、私はmysqlを使用しています – rocco

+1

これらのツールの1つはhttps://github.com/variadico/scaneoまたはhttps://github.com/drone/sqlgenに役立ちますが、サポートされていないようです –

答えて

1

あなたのコード例は疑似コードであると仮定しますが、私は明白な場合を明示します。

db.Query("insert into views (?,?,?,?,?,?) values (?,?,?,?,?,?)", colNames..., values...) 

これは、列名のプレースホルダ(?)を使用することはできませんので、あなただけの関数に最後の引数を「解凍」し、また、無効なMySQLのことができるので、無効ゴーです。

db.Query("insert into views " + colNames + " values" + values) 

これは無効です。文字列をスライスと連結することはできません。


あなたはこのように見える文字列にスライスをfromatできます

colNamesString := "(col1, col2, col3)" 
valuesString := "(val1, val2, val3)" 

、今、あなたの2番目のコード例は、有効な移動になり、をコンパイルするだろうが、これをしません。これを行うと、アプリケーションはSQLインジェクションに対して脆弱になります。これは、あなたが間違いなく欲しいものです。

// this can be a package level global and you'll need 
// one for each table. Keep in mind that Go maps that 
// are only read from are safe for concurrent use. 
var validColNames = map[string]bool{ 
    "col1": true, 
    "col2": true, 
    "col3": true, 
    // ... 
} 

// ... 

var colNames, values []string 
var phs string // placeholders for values 

for k, v := range formData { 
    // check that column is valid 
    if !validColNames[k] { 
     return ErrBadColName 
    } 
    colNames = append(colNames, k) 
    values = append(values, v) 
    phs += "?," 
} 

if len(phs) > 0 { 
    phs = phs[:len(phs)-1] // drop the last comma 
} 
phs = "(" + phs + ")" 

colNamesString := "(" + strings.Join(colNames, ",") + ")" 
query := "insert into views " + colNamesString + phs 
db.Query(query, values...) 
+0

ありがとう!私はこのような解決策を考えていました。 – rocco

関連する問題