gpt4 book ai didi

sql-server - 如果使用sqlserver驱动程序,则映射对现有键返回0

转载 作者:行者123 更新时间:2023-12-01 22:16:44 24 4
gpt4 key购买 nike

只要使用sqlite3驱动程序,我就可以正常使用此代码。当我以某种方式切换到sqlserver时,显然包含值的映射为每个键返回0。

log.Println(current)
for abbr, rate := range fetched.Quotes {
abbr = abbr[3:len(abbr)]
log.Println(abbr, current[abbr])
if c, ok := current[abbr]; ok {
// programm does not reach this with sqlsever driver
}
}

我添加了这些日志语句进行测试。

sqlite(https://github.com/mattn/go-sqlite3)

map[AED:3.67 ARS:44.31 AUD:1.46 BGN:1.77 BRL:3.83 CAD:1.31 CHF:0.99 CNY:6.9 COP:3326.15 CRC:571.81 CZK:23 DOP:51.1 EGP:16.28 EUR:0.9 GBP:0.82 HKD:7.83 HUF:287.01 IDR:14179 INR:69.2 JMD:135.63 JOD:0.71 JPY:107.7 KRW:1162.6 MUR:36.25 MXN:18.85 MYR:4.13 NZD:1.5 PHP:51.71 PLN:3.83 QAR:3.64 RON:4.28 SAR:3.75 SDG:45.09 SEK:9.5 SGD:1.35 THB:30.66 TND:2.88 TWD:31.05 USD:1 UYU:34.65 VND:23291.5]
2019/12/25 11:42:58 XAU 0
2019/12/25 11:42:58 XCD 0
2019/12/25 11:42:58 CHF 0.99
2019/12/25 11:42:58 ZAR 0
2019/12/25 11:42:58 AED 3.67
2019/12/25 11:42:58 BDT 0
2019/12/25 11:42:58 DKK 0
2019/12/25 11:42:58 MXN 18.85
...

sqlserver(https://github.com/denisenkom/go-mssqldb)

2019/12/25 11:44:12 map[AED   :3.67 ARS   :44.31 AUD   :1.46 BGN   :1.77 BRL   :3.83 CAD   :1.31 CHF   :0.99 CNY   :6.9 COP   :3326.15 CRC   :571.81 CZK   :23 DOP   :51.1 EGP
:16.28 EUR :0.9 GBP :0.82 HKD :7.83 HUF :287.01 IDR :14179 INR :69.2 JMD :135.63 JOD :0.71 JPY :107.7 KRW :1162.6 MUR :36.25 MXN :18.85 MYR :4.13 NZD :1.5 PHP :51.71 PLN :3.83 QAR :3.64 RON :4.28 SAR :3.75 SDG :45.09 SEK :9.5 SGD :1.35 THB :30.66 TND :2.88 TWD :31.05 USD :1 UYU :34.65 VND :23291.5]
2019/12/25 11:44:12 KHR 0
2019/12/25 11:44:12 MDL 0
2019/12/25 11:44:12 AED 0
2019/12/25 11:44:12 MXN 0
2019/12/25 11:44:12 VUV 0
2019/12/25 11:44:12 MWK 0
2019/12/25 11:44:12 DOP 0
...

因此,出于某些奇怪的原因,包含已记录的键的映射确实会为所有内容返回0。

这是我用来获取和查询的2个函数

func getFX(db *sql.DB) (fx map[string]float64, err error) {
var (
abbr string
rate float64
)
rows, err := db.Query("SELECT Abbreviation, Conversion_Rate FROM CURRENCY_TEST")
if err != nil {
return fx, err
}
defer rows.Close()
fx = map[string]float64{}
for rows.Next() {
err := rows.Scan(&abbr, &rate)
if err != nil {
return fx, err
}
fx[abbr] = rate
}
err = rows.Err()
if err != nil {
return fx, err
}
return fx, nil
}

func _fetchFX(dummy string, dummy1 string) (Fetched, error) {
jsn, _ := ioutil.ReadFile("data/current.json")
payload := Fetched{}
err := json.Unmarshal(jsn, &payload)
return payload, err
}

如果有人知道为什么会这样,请分享您的智慧。

最佳答案

如评论中所讨论的,sqlserver版本正在检索带有很多空格的Abbreviation,而在sqlite版本中,abbr字符串不包含空格。空格似乎是由sqlserver如何实现列的类型引起的。

因此,您要么必须更改列类型,以使它们之间更加兼容,要么就可以对扫描的Abbr字符串进行“规范化”,以确保始终以相同的方式设置其格式,而与RDBMS无关。

例如:

fx[strings.TrimSpace(abbr)] = rate

关于sql-server - 如果使用sqlserver驱动程序,则映射对现有键返回0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59478170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com