How to properly bind postgresql variable in Go?
up vote
0
down vote
favorite
I have this function that is returning an error sql: Rows are closed
. I can't figure out why...
Here is the function :
func GetUserFromToken(db *sql.DB, token string) User
query := `
SELECT id, token, name, surname, phone, email FROM users WHERE token=$1
`
rows, err := db.Query(query, token)
if err != nil
fmt.Println("query error : " + err.Error())
var user User
rows.Next()
err = rows.Scan(&user.ID, &user.Token, &user.Name, &user.Surname, &user.Phone, &user.Email)
if err != nil
fmt.Println("scan error : " + err.Error())
return user
When I log the token it's the proper token. When I hard code the token in the query for testing purposes, it works fine. For instance :
query := `
SELECT id, token, name, surname, phone, email FROM users WHERE token='abcdefg12345'
`
Tried also to set the query such as :
query := "SELECT id, token, name, surname, phone, email FROM users WHERE token = $1"
row := db.QueryRow(query, "abcdefg12345")
It works fine. fmt.Println(token)
prints abcdefg12345
.
Would someone help me understand what I'm missing ?
UPDATE : found my fail.
So the token I had was the bearer token extracted from the header with the following function :
func GetBearerToken(r *http.Request) string
reqToken := r.Header.Get("Authorization")
splitToken := strings.Split(reqToken, "Bearer")
reqToken = splitToken[1]
return reqToken
Had a leading whitespace that I did not notice in my fmt.Println. After a good night of sleep thinking about @RayfenWindspear's comment I had this urging to check string length then I saw the fail. Feeling a bit idiotic and amused at the same time that I didn't catch it.
So my simple fix :
from: reqToken = splitToken[1]
to : strings.TrimSpace(splitToken[1])
postgresql go
add a comment |
up vote
0
down vote
favorite
I have this function that is returning an error sql: Rows are closed
. I can't figure out why...
Here is the function :
func GetUserFromToken(db *sql.DB, token string) User
query := `
SELECT id, token, name, surname, phone, email FROM users WHERE token=$1
`
rows, err := db.Query(query, token)
if err != nil
fmt.Println("query error : " + err.Error())
var user User
rows.Next()
err = rows.Scan(&user.ID, &user.Token, &user.Name, &user.Surname, &user.Phone, &user.Email)
if err != nil
fmt.Println("scan error : " + err.Error())
return user
When I log the token it's the proper token. When I hard code the token in the query for testing purposes, it works fine. For instance :
query := `
SELECT id, token, name, surname, phone, email FROM users WHERE token='abcdefg12345'
`
Tried also to set the query such as :
query := "SELECT id, token, name, surname, phone, email FROM users WHERE token = $1"
row := db.QueryRow(query, "abcdefg12345")
It works fine. fmt.Println(token)
prints abcdefg12345
.
Would someone help me understand what I'm missing ?
UPDATE : found my fail.
So the token I had was the bearer token extracted from the header with the following function :
func GetBearerToken(r *http.Request) string
reqToken := r.Header.Get("Authorization")
splitToken := strings.Split(reqToken, "Bearer")
reqToken = splitToken[1]
return reqToken
Had a leading whitespace that I did not notice in my fmt.Println. After a good night of sleep thinking about @RayfenWindspear's comment I had this urging to check string length then I saw the fail. Feeling a bit idiotic and amused at the same time that I didn't catch it.
So my simple fix :
from: reqToken = splitToken[1]
to : strings.TrimSpace(splitToken[1])
postgresql go
If you are only looking for a single row, perhaps you should be using golang.org/pkg/database/sql/#DB.QueryRow which wouldn't give you this issue as a *sql.Row doesn't need to be closed. Also note thatrows.Next()
returns anerror
you aren't bothering to check.
– RayfenWindspear
Nov 8 at 22:09
Ok switched to QueryRow. I now facesql: no rows in result set
. I don't quite understand since the token passed is the relevant one (I checked by adding afmt.Println(token)
at start).
– Ado Ren
Nov 8 at 22:24
1
Odd. You might want to take a look at what charset your postgres instance is using as well as what charset could possibly be coming from user input (or wherever this function is being called from). Aside from that, I leave it to the rest of the community... :(
– RayfenWindspear
Nov 8 at 22:53
Thanks RayfenWindspear I updated my post. Your comment lead me in the proper direction!
– Ado Ren
Nov 9 at 8:03
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I have this function that is returning an error sql: Rows are closed
. I can't figure out why...
Here is the function :
func GetUserFromToken(db *sql.DB, token string) User
query := `
SELECT id, token, name, surname, phone, email FROM users WHERE token=$1
`
rows, err := db.Query(query, token)
if err != nil
fmt.Println("query error : " + err.Error())
var user User
rows.Next()
err = rows.Scan(&user.ID, &user.Token, &user.Name, &user.Surname, &user.Phone, &user.Email)
if err != nil
fmt.Println("scan error : " + err.Error())
return user
When I log the token it's the proper token. When I hard code the token in the query for testing purposes, it works fine. For instance :
query := `
SELECT id, token, name, surname, phone, email FROM users WHERE token='abcdefg12345'
`
Tried also to set the query such as :
query := "SELECT id, token, name, surname, phone, email FROM users WHERE token = $1"
row := db.QueryRow(query, "abcdefg12345")
It works fine. fmt.Println(token)
prints abcdefg12345
.
Would someone help me understand what I'm missing ?
UPDATE : found my fail.
So the token I had was the bearer token extracted from the header with the following function :
func GetBearerToken(r *http.Request) string
reqToken := r.Header.Get("Authorization")
splitToken := strings.Split(reqToken, "Bearer")
reqToken = splitToken[1]
return reqToken
Had a leading whitespace that I did not notice in my fmt.Println. After a good night of sleep thinking about @RayfenWindspear's comment I had this urging to check string length then I saw the fail. Feeling a bit idiotic and amused at the same time that I didn't catch it.
So my simple fix :
from: reqToken = splitToken[1]
to : strings.TrimSpace(splitToken[1])
postgresql go
I have this function that is returning an error sql: Rows are closed
. I can't figure out why...
Here is the function :
func GetUserFromToken(db *sql.DB, token string) User
query := `
SELECT id, token, name, surname, phone, email FROM users WHERE token=$1
`
rows, err := db.Query(query, token)
if err != nil
fmt.Println("query error : " + err.Error())
var user User
rows.Next()
err = rows.Scan(&user.ID, &user.Token, &user.Name, &user.Surname, &user.Phone, &user.Email)
if err != nil
fmt.Println("scan error : " + err.Error())
return user
When I log the token it's the proper token. When I hard code the token in the query for testing purposes, it works fine. For instance :
query := `
SELECT id, token, name, surname, phone, email FROM users WHERE token='abcdefg12345'
`
Tried also to set the query such as :
query := "SELECT id, token, name, surname, phone, email FROM users WHERE token = $1"
row := db.QueryRow(query, "abcdefg12345")
It works fine. fmt.Println(token)
prints abcdefg12345
.
Would someone help me understand what I'm missing ?
UPDATE : found my fail.
So the token I had was the bearer token extracted from the header with the following function :
func GetBearerToken(r *http.Request) string
reqToken := r.Header.Get("Authorization")
splitToken := strings.Split(reqToken, "Bearer")
reqToken = splitToken[1]
return reqToken
Had a leading whitespace that I did not notice in my fmt.Println. After a good night of sleep thinking about @RayfenWindspear's comment I had this urging to check string length then I saw the fail. Feeling a bit idiotic and amused at the same time that I didn't catch it.
So my simple fix :
from: reqToken = splitToken[1]
to : strings.TrimSpace(splitToken[1])
postgresql go
postgresql go
edited Nov 9 at 8:06
asked Nov 8 at 22:06
Ado Ren
9518
9518
If you are only looking for a single row, perhaps you should be using golang.org/pkg/database/sql/#DB.QueryRow which wouldn't give you this issue as a *sql.Row doesn't need to be closed. Also note thatrows.Next()
returns anerror
you aren't bothering to check.
– RayfenWindspear
Nov 8 at 22:09
Ok switched to QueryRow. I now facesql: no rows in result set
. I don't quite understand since the token passed is the relevant one (I checked by adding afmt.Println(token)
at start).
– Ado Ren
Nov 8 at 22:24
1
Odd. You might want to take a look at what charset your postgres instance is using as well as what charset could possibly be coming from user input (or wherever this function is being called from). Aside from that, I leave it to the rest of the community... :(
– RayfenWindspear
Nov 8 at 22:53
Thanks RayfenWindspear I updated my post. Your comment lead me in the proper direction!
– Ado Ren
Nov 9 at 8:03
add a comment |
If you are only looking for a single row, perhaps you should be using golang.org/pkg/database/sql/#DB.QueryRow which wouldn't give you this issue as a *sql.Row doesn't need to be closed. Also note thatrows.Next()
returns anerror
you aren't bothering to check.
– RayfenWindspear
Nov 8 at 22:09
Ok switched to QueryRow. I now facesql: no rows in result set
. I don't quite understand since the token passed is the relevant one (I checked by adding afmt.Println(token)
at start).
– Ado Ren
Nov 8 at 22:24
1
Odd. You might want to take a look at what charset your postgres instance is using as well as what charset could possibly be coming from user input (or wherever this function is being called from). Aside from that, I leave it to the rest of the community... :(
– RayfenWindspear
Nov 8 at 22:53
Thanks RayfenWindspear I updated my post. Your comment lead me in the proper direction!
– Ado Ren
Nov 9 at 8:03
If you are only looking for a single row, perhaps you should be using golang.org/pkg/database/sql/#DB.QueryRow which wouldn't give you this issue as a *sql.Row doesn't need to be closed. Also note that
rows.Next()
returns an error
you aren't bothering to check.– RayfenWindspear
Nov 8 at 22:09
If you are only looking for a single row, perhaps you should be using golang.org/pkg/database/sql/#DB.QueryRow which wouldn't give you this issue as a *sql.Row doesn't need to be closed. Also note that
rows.Next()
returns an error
you aren't bothering to check.– RayfenWindspear
Nov 8 at 22:09
Ok switched to QueryRow. I now face
sql: no rows in result set
. I don't quite understand since the token passed is the relevant one (I checked by adding a fmt.Println(token)
at start).– Ado Ren
Nov 8 at 22:24
Ok switched to QueryRow. I now face
sql: no rows in result set
. I don't quite understand since the token passed is the relevant one (I checked by adding a fmt.Println(token)
at start).– Ado Ren
Nov 8 at 22:24
1
1
Odd. You might want to take a look at what charset your postgres instance is using as well as what charset could possibly be coming from user input (or wherever this function is being called from). Aside from that, I leave it to the rest of the community... :(
– RayfenWindspear
Nov 8 at 22:53
Odd. You might want to take a look at what charset your postgres instance is using as well as what charset could possibly be coming from user input (or wherever this function is being called from). Aside from that, I leave it to the rest of the community... :(
– RayfenWindspear
Nov 8 at 22:53
Thanks RayfenWindspear I updated my post. Your comment lead me in the proper direction!
– Ado Ren
Nov 9 at 8:03
Thanks RayfenWindspear I updated my post. Your comment lead me in the proper direction!
– Ado Ren
Nov 9 at 8:03
add a comment |
1 Answer
1
active
oldest
votes
up vote
2
down vote
accepted
Here's how you'd write this code. The err returned will be sql.ErrNoRows if nothing was returned. Let me know how this works, and then maybe I can give other debugging steps.
func GetUserFromToken(db *sql.DB, token string) (u User, err error)
err = db.QueryRow(
"SELECT id, token, name, surname, phone, email FROM users WHERE token=$1",
token,
).Scan(
&u.ID,
&u.Token,
&u.Name,
&u.Surname,
&u.Phone,
&u.Email)
return
Thanks for your answer, even tho it is not what helped fixed the issue it's much more clean and I can return an error. I edited my question in which I explain what was my mistake.
– Ado Ren
Nov 9 at 8:02
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
accepted
Here's how you'd write this code. The err returned will be sql.ErrNoRows if nothing was returned. Let me know how this works, and then maybe I can give other debugging steps.
func GetUserFromToken(db *sql.DB, token string) (u User, err error)
err = db.QueryRow(
"SELECT id, token, name, surname, phone, email FROM users WHERE token=$1",
token,
).Scan(
&u.ID,
&u.Token,
&u.Name,
&u.Surname,
&u.Phone,
&u.Email)
return
Thanks for your answer, even tho it is not what helped fixed the issue it's much more clean and I can return an error. I edited my question in which I explain what was my mistake.
– Ado Ren
Nov 9 at 8:02
add a comment |
up vote
2
down vote
accepted
Here's how you'd write this code. The err returned will be sql.ErrNoRows if nothing was returned. Let me know how this works, and then maybe I can give other debugging steps.
func GetUserFromToken(db *sql.DB, token string) (u User, err error)
err = db.QueryRow(
"SELECT id, token, name, surname, phone, email FROM users WHERE token=$1",
token,
).Scan(
&u.ID,
&u.Token,
&u.Name,
&u.Surname,
&u.Phone,
&u.Email)
return
Thanks for your answer, even tho it is not what helped fixed the issue it's much more clean and I can return an error. I edited my question in which I explain what was my mistake.
– Ado Ren
Nov 9 at 8:02
add a comment |
up vote
2
down vote
accepted
up vote
2
down vote
accepted
Here's how you'd write this code. The err returned will be sql.ErrNoRows if nothing was returned. Let me know how this works, and then maybe I can give other debugging steps.
func GetUserFromToken(db *sql.DB, token string) (u User, err error)
err = db.QueryRow(
"SELECT id, token, name, surname, phone, email FROM users WHERE token=$1",
token,
).Scan(
&u.ID,
&u.Token,
&u.Name,
&u.Surname,
&u.Phone,
&u.Email)
return
Here's how you'd write this code. The err returned will be sql.ErrNoRows if nothing was returned. Let me know how this works, and then maybe I can give other debugging steps.
func GetUserFromToken(db *sql.DB, token string) (u User, err error)
err = db.QueryRow(
"SELECT id, token, name, surname, phone, email FROM users WHERE token=$1",
token,
).Scan(
&u.ID,
&u.Token,
&u.Name,
&u.Surname,
&u.Phone,
&u.Email)
return
answered Nov 8 at 23:15
Alex Guerra
1,678815
1,678815
Thanks for your answer, even tho it is not what helped fixed the issue it's much more clean and I can return an error. I edited my question in which I explain what was my mistake.
– Ado Ren
Nov 9 at 8:02
add a comment |
Thanks for your answer, even tho it is not what helped fixed the issue it's much more clean and I can return an error. I edited my question in which I explain what was my mistake.
– Ado Ren
Nov 9 at 8:02
Thanks for your answer, even tho it is not what helped fixed the issue it's much more clean and I can return an error. I edited my question in which I explain what was my mistake.
– Ado Ren
Nov 9 at 8:02
Thanks for your answer, even tho it is not what helped fixed the issue it's much more clean and I can return an error. I edited my question in which I explain what was my mistake.
– Ado Ren
Nov 9 at 8:02
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53216869%2fhow-to-properly-bind-postgresql-variable-in-go%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
If you are only looking for a single row, perhaps you should be using golang.org/pkg/database/sql/#DB.QueryRow which wouldn't give you this issue as a *sql.Row doesn't need to be closed. Also note that
rows.Next()
returns anerror
you aren't bothering to check.– RayfenWindspear
Nov 8 at 22:09
Ok switched to QueryRow. I now face
sql: no rows in result set
. I don't quite understand since the token passed is the relevant one (I checked by adding afmt.Println(token)
at start).– Ado Ren
Nov 8 at 22:24
1
Odd. You might want to take a look at what charset your postgres instance is using as well as what charset could possibly be coming from user input (or wherever this function is being called from). Aside from that, I leave it to the rest of the community... :(
– RayfenWindspear
Nov 8 at 22:53
Thanks RayfenWindspear I updated my post. Your comment lead me in the proper direction!
– Ado Ren
Nov 9 at 8:03