go-sqlmock icon indicating copy to clipboard operation
go-sqlmock copied to clipboard

Query with WHERE IN shows an error (using sqlx)

Open devFallingstar opened this issue 2 years ago • 1 comments

Hello sqlmock teams. First of all, thanks to this awesome project. It makes me more easier to implement test code with sql system 👍 But I got an arguments do not match error while running SELECT WHERE IN queries in my code.

When I run below test codes on sqlmock environment:

// Test code
db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
sqlxDB := sqlx.NewDb(db, "sqlmock")
wantRows := sqlmock.NewRows([]string{"id", "value"}).
			AddRow("key1", "value1").
			AddRow("key2", "value2")

mock.ExpectQuery(fmt.Sprintf("SELECT * FROM %s WHERE id IN (?, ?)", tableName)).
			WithArgs("key1", "key2").
			WillReturnRows(wantRows)

GetFeatures(tableName, keys) // keys = ["key1", "key2"]

func GetFeatures(tableName, keys) {
    query, args, err1 := sqlx.In(fmt.Sprintf(`SELECT * FROM %s WHERE id IN (?)`, tableName), keys)
    
    // Processing err1 here
    
    query = sqlxDB.Rebind(query)
    rows, err2 := sqlxDB.Queryx(query, args...)

    // Processing err2 here
}

err2 shows an error :

Query 'SELECT * FROM tableName WHERE id IN (?, ?)', arguments do not match: expected 1, but got 2 arguments

Besides, when I run exact same code with a real MySQL DB server which running locally, it doesn't give any other errors. It runs correctly. I think sqlmock doesn't support SELECT WHERE IN but I'm not sure about it. Is there any way to fix those error?

Any help will be appreciate. 😄

devFallingstar avatar Jun 08 '22 01:06 devFallingstar

there is no error, this is a test code: https://go.dev/play/p/23Lgj-9W93o

fatelei avatar Jul 30 '22 08:07 fatelei