我是新手,试图从sqlite数据库中检索数据。 我使用github.com/mattn/go-sqlite3作为sqlite驱动程序。
我发送的查询即使应该也不会返回任何结果。我尝试了我的程序手动生成的查询,当我手动使用查询以及通过程序发送时,它会返回数据。
这是我的代码:
for index := range Array {
id, _ := strconv.Atoi(Array[index])
rand.Seed(time.Now().UnixNano())
RandomNr := rand.Intn(100)
fmt.Printf("index: %d - randomnr: %d \n", id, RandomNr)
rows, errROW := db.Query("SELECT user.id,user.name,stage.link,player.url,player.characterchance,player.chance FROM user,stage,player WHERE user.id = '%d' AND '%d' <= user.chance AND stage.user = user.id AND stage.domain = player.id AND player.chance > 0 ORDER BY player.id ASC \n",id, RandomNr)//.Scan(&idr, &name, &link, &url, &characterchance, &chance)
//this is what the finished query looks like and it returns the rows as its supposed to
//rows, errROW := db.Query("SELECT user.id,user.name,stage.link,player.url,player.characterchance,player.chance FROM user,stage,player WHERE user.id = '203' AND '33' <= user.chance AND stage.user = user.id AND stage.domain = player.id AND player.chance > 0 ORDER BY player.id ASC")
if errROW != nil {
fmt.Println("errROW")
log.Println(errROW)
}
defer rows.Close()
if rows.Next() == false {
fmt.Println("no rows ")
}
for rows.Next() {
fmt.Println("where are the rows")
var id int
var name string
var link string
var url string
var characterchance int
var chance int
rows.Scan(&id, &name, &link, &url, &characterchance, &chance)
fmt.Println(id,name,link,url,characterchance,chance)
}
rows.Close()
}
}
此查询可以返回多行和单行。我也尝试通过QueryRow检索数据作为单行,也没有返回任何结果。
非常感谢任何帮助。
更新: 我补充道 如果rows.Next()== false
试图找到问题。删除它会产生相同的结果。此外,我没有从扫描中收到错误消息。 for rows.next()循环甚至不会被执行。
答案 0 :(得分:2)
当你这样做时:
int puts(char *s);
section .data
nl db 10
null_msg db "(null)", 10
section .text
global _ft_puts
_ft_puts:
mov rax, rdi
cmp rdi, 0
jz nul
xor r9, r9
jmp len
len:
cmp byte[rdi + r9], 0
jz write
inc r9
jmp len
write:
mov rax, 0x2000004
mov rsi, rdi
mov rdi, 1
mov rdx, r9
syscall
mov rax, 0x2000004
lea rsi, [rel nl]
mov rdi, 1
mov rdx, 1
syscall
jmp return
nul:
mov rax, 0x2000004
mov rdi, 1
lea rsi, [rel null_msg]
mov rdx, 7
syscall
jmp return
return:
mov rax, 1
ret
您正在滚动到第一行
和
if rows.Next() == false
移至下一行
基本上,您正在跳过您提供的示例代码中结果集中的第一行。
另外,您忽略了扫描中的错误。
如果查询返回至少2行(因为第一行被跳过),这看起来会打印一些东西
答案 1 :(得分:0)
好的我弄清楚问题是什么:
在我的查询中,我使用:%d作为我的变量的占位符,当我应该使用$ 1,$ 2等时使用此查询返回预期的结果。
我觉得很奇怪,允许这种行为从go或sqlite返回没有错误,甚至在你打印出查询并手动使用sqlite3时也能正常工作。来自C并刚刚开始,这显然是令人头疼的原因。