【发布时间】:2021-11-02 03:56:25
【问题描述】:
我如何避免重复自己,将 ToSql 数据作为闭包传递,告诉 tokio-postgres 哪些数据列,从我的各种结构模型到 COPY/SELECT/etc?
例如,理想情况下我可以传递各种表/列参数,例如:
// see MRE, "copy_in" performs boilerplate to copy binary format in postgres table
copy_in(
&mut client, // the postgres client setup in tokio
"table_name", // meta info about what table/columns to insert
&["col1", "col2", "col3", "col4"],
&vec![Type::INT4, Type::VARCHAR, Type::INT4, Type::INT4],
&rows_of_struct_data, // the vec of data I plan to insert
// then here's the hard part: which fields to extract from each row... (not works)
|m| &[&[&m.id], &[&m.name], &[&m.range_begin, &m.range_end]] as &[&[&(dyn ToSql + Sync)]]
);
tokio_postgres 需要writing binary data during a copy、Vec<&(dyn ToSql + Sync)> 的类型,尽管硬编码将pushed 输入到 Vec 中的内容有效,但我很困惑如何传递一个动态决定 push 的参数。 .
对此我有两个想法,但是推荐的方法是什么?
- 如MRE 所示,我可以将闭包传递给我的复制函数,该函数返回每行要写入标准输入的哪些列,但我如何键入闭包以避免?:
应为
&dyn ToSql + Sync,找到特征对象dyn ToSql
- 或者,如 MRE 所示,我可以将
Vec传递给我的闭包,以便将列数据推送到每一行,但这有几个生命周期问题,例如:
对
row的引用在此处转义异步闭包体
【问题讨论】:
标签: rust closures rust-tokio tokio-postgres