我在Rust中使用rusqlite crate在SQLite数据库上执行SQL查询。我有一个查询,需要使用IN子句根据值列表过滤行。我想知道是否有一种方法可以直接将数组或向量作为IN子句的参数传递,而不是为列表中的每个元素创建占位符。
例如,假设我有以下查询:
SELECT * FROM articles WHERE url IN (?);
我想传递一个Rust vector作为?占位符,如下所示:
let urls: Vec<String> = vec![
"example1.com".to_string(),
"example2.com".to_string(),
];
let result: Vec<String> = easy_query!(query, params![urls], Vec<String>)?;
有没有更直接的方法来实现这一点,而不必为数组或向量中的每个元素创建占位符,并将它们作为单独的参数传递?
提前感谢您的帮助。
- 注意:示例中显示的easy_query! macro不是rusqlite crate的一部分。它是一种自定义的语法糖,我使用它来简化查询过程,减少冗长。问题仍然集中在直接在rusqlite中传递数组或向量作为IN子句的参数。*
2条答案
按热度按时间ozxc1zmp1#
似乎没有任何方法可以直接将数组传递到SQLite的IN中,您确实需要占位符,但您可以通过使用
std::iter::repeat()
和collect::<Vec<_>>().join(",")
来使其相对简单:playground(仅显示生成的占位符)
nb:Postgres确实支持数组的使用,但为此使用了ANY而不是IN。
但SQLite(就我对该产品的有限了解而言)并不提供它。
qvk1mo1f2#
对于SQLite,有carray扩展。对于rusqlite,有rarray扩展。