2016-07-18 3 views
1
var SelectUser, _ = Database.Prepare("SELECT $1 FROM users WHERE id=$2 LIMIT 1;") 
    var name string 
    SelectUser.QueryRow("name", 1).Scan(&name) 

Wenn ich so tun bekam ich einen Fehler:Postgres vorbereiten Abfrage, Spalten als Variable

runtime error: invalid memory address or nil pointer dereference

Aber wenn Spalte ist nicht variabel, alles ok.

var SelectUser, _ = Database.Prepare("SELECT name FROM users WHERE id=$1 LIMIT 1;") 
var name string 
SelectUser.QueryRow(1).Scan(&name) 

Wie kann ich Spalten als Variablen übergeben?

+1

Mögliche Duplikat [Golang ORDER BY Ausgabe mit MySql] (http://stackoverflow.com/questions/30867337/ Golang-Reihenfolge-nach-Problem-mit-Mysql) – icza

Antwort

0

Sie ignorieren den Fehler der Database.Prepare Anweisung. Wenn Sie den Fehler überprüfen, werden Sie feststellen, dass es fehlschlägt, die SQL vorzubereiten. Der Grund, warum scheitert es bereits hier beantwortet von icza:

Golang ORDER BY issue with MySql

0

Effektiv Sie nicht Variable als Feldnamen in einer Abfrage verwenden können, müssen Sie durch eine dynamische Abfrage übergeben.

Versuchen Sie, eine Funktion zu erstellen:

CREATE OR REPLACE FUNCTION getFieldFromUserById(field_name character varying, id_user integer) 
    RETURNS SETOF character varying AS 
    $BODY$begin 
     return query execute 'SELECT '||field_name||' FROM users WHERE nart='||id_user||' LIMIT 1'; 
end 
$BODY$ 
LANGUAGE plpgsql VOLATILE 

und Ihr Code:

var SelectUser, _ = Database.Prepare("SELECT getFieldFromUserById($1,$2);") 
var name string 
SelectUser.QueryRow("name", 1).Scan(&name)