gen icon indicating copy to clipboard operation
gen copied to clipboard

通过gorm-gen生成的代码,无法使用Sharding查询

Open coderyw opened this issue 2 years ago • 4 comments

这是我定义的分片配置

err := db.Use(sharding.Register(sharding.Config{
		DoubleWrite:         false,
		ShardingKey:         "userId",
		NumberOfShards:      num,
		PrimaryKeyGenerator: 2,
	}, model.Task{}))

然后我使用gorm-gen生成的查询方法进行查询,

//(这里的db也就是生成的Query)
db.Task.WithContext(ctx).Where(db.Task.UserID.Eq(userId)).Where(db.Task.ID.Eq(id), db.Task.DelFlag.Eq(0)).First()

我上面配置的是userId位shardingKey,这里也使用了这个条件,但是结果返回ErrMissingShardingKey错误。

我使用下面正常查询方式就可以

db.db.Model(m).Where("userId=? and id=? and delFlag=?", userId, int64(id), 0).First(m).Error

请问是我哪里有问题吗

coderyw avatar Nov 04 '23 02:11 coderyw

@coderyw 加上debug 看看输出的sql,是否符合预期就好了

qqxhb avatar Nov 16 '23 02:11 qqxhb

@coderyw 加上debug 看看输出的sql,是否符合预期就好了

看了,表名不对的。现在我的做法是手动分表,然后执行User.Table(name),copy出预期表名的userDao出来

coderyw avatar Nov 24 '23 09:11 coderyw

我遇到了同样的问题,发现两种方式的SQL不一样,第一种就会分表失效

//第一种
 u := query.UserTab
ctx := context.Background()
result, err := u.WithContext(ctx).Where(u.Username.Eq("user_2")).Find()

对应SQL:SELECT * FROM user_tab WHERE user_tab.username = ?

//第二种
DB.Model(&model.UserTab{}).Where("username", "user_2").Find(&tab2)

对应SQL:SELECT * FROM user_tab WHERE username = ?

Harmor1 avatar Aug 01 '24 15:08 Harmor1