【发布时间】:2020-07-17 17:11:58
【问题描述】:
我需要在生产环境中为基于 Rocket 的应用程序运行 Diesel 数据库迁移。通常有几种方法可以为数据库执行迁移:
- 在应用程序启动时。
- 独立于应用程序启动。
我更喜欢使用应用程序二进制文件的--migrate 标志调用的第二个选项,但由于目标应用程序相当简单,第一种方法就可以了。
有一个 thread in the Diesel issue tracker 关于在生产中运行迁移并建议如何进行:
- 将
diesel_migrations添加到您的依赖项中- 在您的箱子中添加一个
extern crate diesel_migrations,并确保用#[macro_use]装饰它- 在代码的开头添加
embed_migrations!()- 要运行迁移,请使用
embedded_migrations::run(&db_conn)
在main.rs我做了:
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use]
extern crate diesel;
#[macro_use]
extern crate diesel_migrations;
#[macro_use]
extern crate rocket;
#[macro_use]
extern crate rocket_contrib;
#[database("my_db_name")]
pub struct DbConn(diesel::PgConnection);
fn main() {
// Update database
embed_migrations!();
embedded_migrations::run(&DbConn);
// Launch the app
...
}
这会导致错误:
error[E0277]: the trait bound `fn(diesel::r2d2::PooledConnection<<diesel::PgConnection as rocket_contrib::databases::Poolable>::Manager>) -> DbConn {DbConn}: diesel::Connection` is not satisfied
--> src/main.rs:30:30
|
29 | embed_migrations!();
| --------------------
| |
| required by this bound in `main::embedded_migrations::run`
30 | embedded_migrations::run(&DbConn);
| ^^^^^^^ the trait `diesel::Connection` is not implemented for `fn(diesel::r2d2::PooledConnection<<diesel::PgConnection as rocket_contrib::databases::Poolable>::Manager>) -> DbConn {DbConn}`
|
= note: required because of the requirements on the impl of `diesel_migrations::MigrationConnection` for `fn(diesel::r2d2::PooledConnection<<diesel::PgConnection as rocket_contrib::databases::Poolable>::Manager>) -> DbConn {DbConn}`
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
如何解决?
【问题讨论】:
-
你不应该用连接实例而不是连接类型来调用
run吗?即:let db_conn = whatever; embedded_migrations::run (&db_conn);? -
我不知道您为什么要在柴油问题跟踪器中挖掘不完整的信息,而不是使用 corresponding 文档。除此之外,您将需要一个实现
Connection的实例,所以要么按照火箭文档(我在那里看到他们的神奇宏的东西)建议做任何事情,要么只是在应用程序开始运行迁移时建立一个新的PgConnection。
标签: database rust database-migration rust-diesel rust-rocket