为什么Rusqlite执行初始化脚本时仅创建第一张表?
问题原因
rusqlite的db.execute()方法仅会执行传入SQL字符串中的第一条语句——它的设计目标是处理单条SQL命令,遇到第一个分号就会停止执行后续内容,因此TestTable2的建表语句根本没有被运行。
解决方案
有两种可行的解决方式:
方法1:使用execute_batch方法替换execute
rusqlite提供了专门用于执行多条SQL语句的execute_batch方法,它会自动处理分号分隔的多条命令,修改后的代码如下:
fn main() { let db = rusqlite::Connection::open("test.db").unwrap(); let command = std::fs::read_to_string("create.sql").unwrap(); // 替换execute为execute_batch,处理多条SQL语句 db.execute_batch(&command).unwrap(); }
方法2:拆分SQL语句逐条执行
如果需要更精细的控制(比如每条语句执行后做额外处理),可以将读取到的SQL字符串按分号拆分,过滤掉空行和无效内容后逐条执行:
fn main() { let db = rusqlite::Connection::open("test.db").unwrap(); let command = std::fs::read_to_string("create.sql").unwrap(); // 拆分语句并过滤空行、无效内容 for stmt in command.split(';').map(|s| s.trim()).filter(|s| !s.is_empty()) { db.execute(stmt, []).unwrap(); } }
内容的提问来源于stack exchange,提问作者axolotlKing0722
相关产品推荐
相关产品推荐

