go里面报错sql: expected 0 arguments, got 1 问题的解决

Golang数据库操作坑
本文深入探讨使用Golang操作PostgreSQL和Oracle数据库时的常见陷阱,特别是在SQL参数化方面的差异,以及如何避免这些陷阱。

之前搞java比较多,用go也是用gorm,xorm这些orm框架,直接拿着sql.db对象去操作数据库比较少,一不小心就掉进一个小坑里面去了,golang操作postgres数据库可以用lib/pg驱动,写查询条件参数的时候例如

select  a from b where c=?

这么写在java里面是没有问题,但是在golang里面不行,会报无效字符,针对postgres数据库写条件参数需要用$1,$2这样的,正确的写法是:

select a from b where c=$1

但是。。。。换到oracle数据库的话,这么写就又不行了,针对oracle如果用?的话会提示:

sql: expected 0 arguments, got 1

针对oracle的正确写法是

select a from b where c=:param1

就是冒号:加参数名称这样的

我靠,用框架的话真不知道还有这些坑啊!

另外虽然说是golang支持变参传递,但是有参数的SQL和无参数的SQL调用的查询方法也得分开,例如

sql:="select * from table1"

args:=nil

如果用db.Query(sql,args) 就不行,必须用db.Query(sql),否则也会报expected 0 arguments,got 1这个错误。

 

 

不同场景下解决Expected 0 arguments, but got 1.”错误的方法有所不同: - **TypeScript层面**:该错误指示类型不匹配问题,虽然不会在JavaScript运行时引发错误,但反映了代码中潜在逻辑问题,需确保函数调用时传入的参数数量与函数定义的参数数量一致,解决类型不匹配问题[^1]。例如: ```typescript // 定义一个无参数函数 function greet(): void { console.log('Hello!'); } // 正确调用 greet(); // 错误调用,会出现Expected 0 arguments, but got 1错误 // greet('World'); ``` - **TS打包场景**:使用ts打包报此错误时,要检查形参和实参个数是否匹配。例如,若有函数定义需要参数,调用时必须传入相应参数;若函数定义无参数,调用时则不能传入参数[^2]。 ```typescript // 定义一个需要参数的函数 function add(a: number): number { return a + 1; } // 正确调用 const result = add(5); // 错误调用,会出现Expected 1 arguments, but got 0错误 // const wrongResult = add(); ``` - **Angular6打包场景**:当angular6打包出现此错误,如在`.html`文件中,要检查模板中调用的函数参数传递是否正确,保证传入的参数数量与组件中函数定义的参数数量一致[^3]。 - **Go操作数据库场景**:在Go里使用`sql`操作数据库出现“sql: expected 0 arguments, got 1”错误,要检查SQL语句的参数使用。例如使用`lib/pg`驱动操作Postgres数据库,写查询条件参数时要正确处理。如果使用ORM框架(如gorm、xorm),确保查询方法的参数使用正确,避免传入多余参数[^4][^5]。 ```go package main import ( "gorm.io/driver/sqlite" "gorm.io/gorm" ) type Baike struct { ID int CreateTime string } func main() { db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("failed to connect database") } var plist []Baike var id int = 1 // 错误调用,会出现sql: expected 0 arguments, got 1错误 // err = db.Order("createTime DESC").Limit(10).Find(&plist, "id=?", id).Error // 正确调用 err = db.Order("createTime DESC").Limit(10).Find(&plist).Error if err != nil { // 处理错误 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peihexian

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值