今天我一直在关注Rust的Diesel ORM,但我无法使用时间戳
Cargo.toml
[依赖项]
diesel={version=“0.6.2”,功能=[“chrono”]}
diesel_codegen={version=“0.6.2”,默认功能=false,功能=[“夜间”,“postgres”]}
dotenv=“0.8.0”
dotenv_macros=“0.8.0”
型号.rs
#[派生(可查询)]
发布结构作者{
酒吧id:i32,
酒吧名:String,
酒吧姓氏:String,
发布电子邮件:String
}
发布结构后{
酒吧id:i32,
酒吧作者:作者,
酒吧名称:字符串,
酒吧主体:字符串,
酒吧出版:布尔,
pub-created:Timestamp,
发布更新:时间戳
}
(我读到有一个diesel::types::Timestamptype)
lib.rs
#![功能(自定义\派生、自定义\属性、插件)]
#![插件(diesel_codegen、dotenv_宏)]
#[宏_使用]
外部板条箱柴油机;
外部板条箱dotenv;
pub-mod模式;
pub-mod模型;
使用柴油机::前奏::*;
使用diesel::types::Timestamp;
使用柴油机::pg::pg连接;
使用dotenv::dotenv;
使用std::env;
发布fn建立_连接()->;PG连接{
dotenv().ok();
让database\u url=env::var(“database\u url”)。
expect(“必须设置数据库URL”);
PgConnection::建立(&;数据库\u url)。
expect(&;format!(“连接到{},数据库\ url时出错))
}
但当我尝试使用它时,会出现以下错误:
<;柴油机宏>;:5:1:5:71注:在本次扩展的表格_正文中!(在<;柴油机宏>;中定义)
src/schema.rs:1:1:40注意:在这个表的扩展中!(在<;柴油机宏>;中定义)
src/schema.rs:1:1:40注意:在这个推断模式的扩展中!(在src/lib.rs中定义)
src/lib.rs:1:1:1帮助:运行'rustc--explain E0412'查看详细说明
src/lib.rs:1:1:1帮助:在您的项目中找不到名为'Timestamptz'的候选人;可能您拼错了名称或忘记导入外部板条箱?
src/lib.rs:1:1:1错误:类型名'Timestamptz'未定义或不在范围[E0412]on
src/lib.rs:1#![功能(自定义\派生、自定义\属性、插件)]
...
<;柴油机宏>;:38:1:38:47注:在此扩展列中!(在<;柴油机宏>;中定义)
<;柴油机宏>;:5:1:5:71注:在本次扩展的表格_正文中!(在<;柴油机宏>;中定义)
src/schema.rs:1:1:40注意:在这个表的扩展中!(在<;柴油机宏>;中定义)
src/schema.rs:1:1:40注意:在这个推断模式的扩展中!(在src/lib.rs中定义)
src/lib.rs:1:1:1帮助:运行'rustc--explain E0412'查看详细说明
src/lib.rs:1:1:1帮助:在您的项目中找不到名为'Timestamptz'的候选人;可能您拼错了名称或忘记导入外部板条箱?
src/models.rs:16:18:16:27错误:类型名'Timestamp'未定义或不在范围[E0412]on
src/models.rs:16 pub created:Timestamp,
^~~~~~~~~
src/models.rs:16:18:16:27帮助:运行'rustc--explain E0412'查看详细说明
src/models.rs:16:18:16:27帮助:您可以将其导入范围:`use diesel::types::Timestamp;`。
src/models.rs:17:18:17:27错误:类型名'Timestamp'未定义或不在范围[E0412]on
src/models.rs:17发布更新:时间戳
^~~~~~~~~
看起来像是第一个错误,timestamtz是由于推断模式不知道如何解释表中已经存在的Postgresql类型造成的。至于第二个,我想如果显式导入Timestamp类型,我可以用它创建一个Post结构
有没有什么明显的事情表明我做错了
顺便说一句,我对生锈和柴油机使用相当多的代码生成非常陌生,所以很容易丢失,但我认为这应该是一件简单的事情来完成
编辑:
我使用带时区的时间戳创建了表,看起来可能还不支持:
创建表格帖子(
...
已创建时区不为空的时间戳,
带时区的更新时间戳
)
编辑2:
我更改了models.rs如下所示,并消除了时间戳未定义的错误。我还意识到,我需要在每个要派生的结构之上使用#[派生(Queryable)]。下面的编译很好,但以前的Timestamptz错误仍然存在:
使用diesel::types::Timestamp;
#[导出(可查询)]
发布结构作者{
酒吧id:i32,
酒吧名:String,
酒吧姓氏:String,
发布电子邮件:String
}
#[导出(可查询)]
发布结构后{
酒吧id:i32,
酒吧作者:作者,
酒吧名称:字符串,
酒吧主体:字符串,
酒吧出版:布尔,
pub-created:Timestamp,
发布更新:时间戳
}
diesel::sql\u types中的所有类型都是表示模式的各种sql数据类型的标记。它们不应该在您自己的结构中使用。您需要的是实现diesel::反序列化::FromSql<;柴油机::sql_类型::时间戳,柴油机::pg::pg>(文档:FromSql,Timestamp,Pg)。有两种类型实现了这种特性
第一个是std::time::SystemTime,它不需要额外的依赖项,但没有太多的功能
第二个是chrono::NaiveDateTime。这可能就是你想要的类型。为了使用它,您需要将chrono添加到依赖项中,并将Cargo.toml中的diesel行更改为包含chrono特性,因此它看起来像diesel={version=“0.7.0”,features=[“postgres”,“chrono”]}
(从技术上讲,还有第三种类型,即diesel::data_types::PgTimestamp,但这几乎肯定不是您想要的,因为该结构只是数据库中时间戳的文字表示,所以其他类型不必担心原始字节)