我正在Rust中构建一个webapp,并尝试实现基本的Rails风格的数据库迁移来管理我的数据库。在我的代码中,Migration是一种特性,具有应用和回滚迁移的上下方法。每个单独的数据库迁移都是实现迁移特征的结构。
我从这个版本的Migration trait开始,它编译得很好:
pub trait Migration : Display {
fn up(&self, connection: &postgres::Connection) -> postgres::Result<()>;
fn down(&self, connection: &postgres::Connection) -> postgres::Result<()>;
}
但理想情况下,我希望允许调用者传入事务对象或原始连接对象来运行迁移。 Postgres crate通过提供连接和事务实现的GenericConnection
特征来支持这一点。所以我重构了我的迁移特性:
pub trait Migration : Display {
fn up<T: postgres::GenericConnection>(&self, connection: &T) -> postgres::Result<()>;
fn down<T: postgres::GenericConnection>(&self, connection: &T) -> postgres::Result<()>;
}
但是现在编译时,任何试图使用Migration的代码都会生成错误the trait db::migrations::migration::Migration is not implemented for the type db::migrations::migration::Migration
。例如,我有一个跟踪我所有迁移的结构:
pub struct MigrationIndex {
/// all database migrations, in order from first to last
migrations: Vec<Box<Migration>>
}
它与Migration
特征的第一个版本编译良好,并且在使用带有泛型的Migration
版本时失败并出现上述错误。我在特征错误中使用泛型吗?