如何通过Rust SQLx获取SQLite引擎自省信息?解决查询报错
解决SQLx查询SQLite自省信息时的rowid错误
错误原因
pragma_module_list()是SQLite的虚拟系统表,其结构中并不包含rowid字段,直接在SELECT语句中引用该字段会触发数据库层面的错误,并非SQLx的限制。
解决方案
方法1:用窗口函数生成替代ID
如果需要一个自增的唯一标识,可以使用SQLite的ROW_NUMBER()窗口函数生成替代rowid的id字段:
let recs = sqlx::query!( r#" SELECT ROW_NUMBER() OVER (ORDER BY name) AS id, name FROM pragma_module_list() ORDER BY id "# );
方法2:直接查询虚拟表的原生字段
如果不需要额外的id字段,直接查询pragma_module_list()提供的原生字段即可:
let recs = sqlx::query!( r#" SELECT name, filename, origin FROM pragma_module_list() ORDER BY name "# );
方法3:SQLite _rowid_关键字说明(仅部分虚拟表支持)
部分SQLite虚拟表支持通过_rowid_引用内部行标识,但pragma_module_list()并不支持此方式,仅作为补充说明。若后续使用其他支持的虚拟表,可尝试:
// 仅适用于支持_rowid_的虚拟表,pragma_module_list()不适用 let recs = sqlx::query!( r#" SELECT _rowid_ AS id, name FROM some_supported_virtual_table ORDER BY id "# );
内容的提问来源于stack exchange,提问作者PChemGuy
相关产品推荐
相关产品推荐

