有没有办法使用 Redisql 包获得与 ServiceStack.Redis 列的数据类型相同的结果?

问题描述

我想使用带有以下语句的 c# 的 ServiceStack.Redis 包连接到 Redis

        var redisManager = new RedisManagerPool("127.0.0.1:6380");
        var redis = redisManager.GetClient();

        redis.Custom("DEL","DB");

        redis.Custom("REDIsql.CREATE_DB","DB");
        redis.Custom("REDIsql.EXEC","DB","CREATE TABLE TABLE1(A INT,B TEXT);");
        redis.Custom("REDIsql.CREATE_STATEMENT","INSERTINTOTABLE1STMT","INSERT INTO TABLE1 VALUES(?1,?2)");
        redis.Custom("REDIsql.EXEC_STATEMENT",1,"Value1");
        redis.Custom("REDIsql.EXEC_STATEMENT",2,"Value2");
        var res = redis.Custom("REDIsql.EXEC","SELECT * FROM TABLE1");

查询执行得很好。表 1 的“A”列定义为整数。但是从 TABLE1 中检索所有行的最终命令将 'A' 列的数据作为 Text 返回,因为结果是 RedisText 类型。

有没有办法得到与列数据类型相同的结果?

解决方法

127.0.0.1:6379> REDISQL.V2.CREATE_DB DB
1) 1) "OK"
127.0.0.1:6379> REDISQL.EXEC DB COMMAND "CREATE TABLE TABLE1(A INT,B TEXT);"
1) 1) "DONE"
2) 1) (integer) 0
127.0.0.1:6379> REDISQL.EXEC DB COMMAND "INSERT INTO TABLE1 VALUES (1,'A'),(2,'B');"
1) 1) "DONE"
2) 1) (integer) 2
127.0.0.1:6379> REDISQL.EXEC DB COMMAND "SELECT  * FROM TABLE1;"
1) 1) "RESULT"
2) 1) "A"
   2) "B"
3) 1) "INT"
   2) "TEXT"
4) 1) (integer) 1
   2) "A"
5) 1) (integer) 2
   2) "B"
127.0.0.1:6379> REDISQL.EXEC DB COMMAND "SELECT  * FROM TABLE1;" json
"{\"rows\":[{\"A\":1,\"B\":\"A\"},{\"A\":2,\"B\":\"B\"}],\"number_of_rows\":2,\"columns\":{\"A\":\"INT\",\"B\":\"TEXT\"}}"

正如您所提到的,问题在于 ServiceStack 返回一个简单的 RedisText 而不是解释 redis 协议中的正确数据。

在上面的示例中,我使用了 RediSQL V2(现在称为 zeeSQL https://zeesql.com),它也返回列的类型。

此外,我们可以使用正确的类型直接返回 JSON。

有关 zeeSQL 中所有命令的更多信息在这里:https://doc.zeesql.com/references

不幸的是,除了向 ServiceStack 维护者提出建议之外,我认为我们无能为力。

明显的建议是切换到 RediSQL V2 / zeeSQL。我们与 RediSQL V1 保持完美的向后兼容性。

您只需在命令前加上 REDISQL.V1 而不是 REDISQL