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
相关产品推荐
相关产品推荐

