You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go操作SQLite时提示cidr列不存在及加引号后无数据的问题

SQLite与Go程序查询异常问题排查

我在SQLite中有一张mmdb_csv表,通过.schema命令查看表结构如下:

CREATE TABLE mmdb_csv (
cidr TEXT,
asn TEXT
);

我将包含cidr、asn、autonomous_system_organization、isp、organization字段的CSV文件导入该表,导入命令为:

sqlite>.mode csv
sqlite>.import /home/igor/go/src/universal_blocklist_service2/mmdb-csv.csv mmdb_csv  

问题1:无引号查询提示列不存在

我的Go程序中最初使用以下代码执行查询:

str := fmt.Sprint("SELECT cidr FROM ", conf.SQLiteASN2CIDR, " WHERE asn=?;")
w.FindCidrsStmt, err = w.DBase.Prepare(str)
if err != nil {
    w.log.Fatal().Msgs(err, " from NewRepairStruct()")
}

data, err := w.FindCidrsStmt.Query(asn)
if err != nil { 
    w.log.Error().Msgs(err, " from getCIDRs() 1, asn=", asn)
    return nil
}

其中conf.SQLiteASN2CIDR的值为mmdb_csv。运行代码后出现错误日志:

"SQL logic error: no such column: cidr (1) from getCIDRs() 1, asn=59711"

但在SQLite终端执行完全相同的查询语句,却能正常返回结果:

sqlite> select cidr from mmdb_csv where asn=59711 limit 10;
5.149.248.0/23
5.149.254.0/23
77.83.196.0/23
77.83.198.0/24
79.141.164.0/23
79.141.172.0/24
79.141.174.0/23
88.218.206.0/24
91.193.18.0/24
91.250.244.0/24

为什么Go程序中执行会提示cidr列不存在?

问题2:加引号后无查询结果

之后我尝试给SQL语句中的cidr和asn加上双引号,修改后的代码如下:

str := fmt.Sprint("SELECT \"cidr\" FROM ", conf.SQLiteASN2CIDR, " WHERE \"asn\"=?;")
w.FindCidrsStmt, err = w.DBase.Prepare(str)
if err != nil {
    w.log.Fatal().Msgs(err, " from NewRepairStruct()")
}

data, err := w.FindCidrsStmt.Query(asn)
if err != nil { 
    w.log.Error().Msgs(err, " from getCIDRs() 1, asn=", asn)
    return nil
}

修改后不再出现错误日志,但查询结果data中没有数据,for data.Next()循环根本不会执行。这是什么原因?


内容的提问来源于stack exchange,提问作者Igor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:34:52