Go orm在实际生产中遇到的若干问题

golang有若干常用orm库, 如gorm, sqlx等, 在这里总结一下在生产中遇到的问题:

sqlx:
  • 1)对于一些经过中间件处理的mysql数据库,即直接访问的实体不是mysql本身, 对于这类数据库实体, 有可能不支持prepare 命令类型
 PREPARE stmt FROM `SELECT * FROM xxx WHERE report_time>=? AND report_time<?`;
ERROR 1149 (42000): 1.1-7: syntax error, unexpected NAME

sqlx往往会在大部分接口处实现prepare命令, 导致在orm发出的普通query查询等语句中, 往往会先运行prepare命令, 如下数据库支持prepare,其日志:

| 2019-09-11 15:51:42.080353 | root[root] @  [172.24.73.128] |      1473 |         0 | Prepare      | SELECT * FROM task_config WHERE task_id = ?   |
| 2019-09-11 15:51:42.080373 | root[root] @  [172.24.73.128] |      1473 |         0 | Execute      | SELECT * FROM task_config WHERE task_id = 202 |

因此,对于不支持preparemysql实体,必须使用此链接办法,才能避免出现数据库查询报错, 报错类型多为针对prepare?, 如:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? ......
  • 2)sqlx 支持unsafa , 其用于用户只希望将部分结果存于结构体中:
udb := db.Unsafe()
err = udb.Get(&p, "SELECT * FROM person, place LIMIT 1;")

unsafe只作用于以上将查询结果对象作为参数传入的情况, 对于Query等不支持, 这时候需要用Queryx, 以下示例用于总结12两点:

query := fmt.Sprintf("SELECT * FROM xxx WHERE xxx BETWEEN %v AND %v", start, end)
udb := db.Unsafe()
rows, err := udb.Queryx(query)

switch {
	case err == sql.ErrNoRows:
		return nil, nil
	case err != nil:
		return nil, err
	}
	var ms []Ms
	if rows != nil {
		err = sqlx.StructScan(rows, &ms)
		rows.Close()
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值