Ruby中使用sqlite3 gem解析SQLite3查询结果遇字段名获取问题
解决Ruby sqlite3 gem无法通过列名访问查询结果的问题
我之前也踩过这个坑!默认情况下,Ruby的sqlite3 gem执行execute方法返回的每一行结果是普通数组,而不是键值对形式的哈希,所以你没法直接用row["ZTITLE"]这种列名的方式获取值,只能通过索引(比如row[0]、row[1])来访问。
下面给你两种最实用的解决办法:
1. 全局设置结果为哈希格式
在打开数据库的时候,设置results_as_hash属性为true,这样所有查询的结果都会以哈希形式返回,键就是数据库的列名:
db = SQLite3::Database.new "/path/to/database.sqlite" db.results_as_hash = true # 开启哈希结果模式 db.execute("SELECT * FROM `ZSFNOTE` WHERE `ZTRASHED` LIKE '0'") do |row| puts row["ZTITLE"] # 现在就能正常通过列名获取值了 end
2. 针对单个查询设置哈希结果
如果你只需要某一次查询返回哈希格式,也可以在execute方法里直接传入参数:
db = SQLite3::Database.new "/path/to/database.sqlite" db.execute( "SELECT * FROM `ZSFNOTE` WHERE `ZTRASHED` LIKE '0'", results_as_hash: true # 仅本次查询生效 ) do |row| puts row["ZTITLE"] end
额外小技巧:获取表头信息
如果需要单独获取查询的列名(表头),可以使用execute2方法,它会把表头作为第一行结果返回:
db.execute2("SELECT * FROM `ZSFNOTE` WHERE `ZTRASHED` LIKE '0'") do |row| # 第一行是表头 if row == db.execute2("SELECT * FROM `ZSFNOTE` WHERE `ZTRASHED` LIKE '0'").first puts "查询的列名:#{row.join(', ')}" else # 通过索引访问值,需要先找到ZTITLE对应的索引位置 title_index = db.execute2("SELECT * FROM `ZSFNOTE`").first.index("ZTITLE") puts "笔记标题:#{row[title_index]}" end end
不过这种方式不如直接用哈希结果来得方便,适合特殊场景下需要处理表头的情况。
内容的提问来源于stack exchange,提问作者craigeley
相关产品推荐
相关产品推荐

