Skip to main content

siderite_orm/
router.rs

1//! Database routing: pick the database alias for reads and writes
2//! (Django `DATABASE_ROUTERS`).
3//!
4//! Implement [`DatabaseRouter`] and attach it with
5//! [`Databases::with_router`](crate::Databases::with_router). Each hook may
6//! return an alias registered in the [`Databases`](crate::Databases); `None`
7//! defers to the default (`"default"`). A router naming an alias that is not
8//! registered yields [`OrmError::UnknownDatabase`](crate::OrmError::UnknownDatabase).
9//!
10//! ```ignore
11//! struct ReplicaRouter;
12//!
13//! impl DatabaseRouter for ReplicaRouter {
14//!     fn db_for_read(&self, _model: &ModelMeta) -> Option<&str> {
15//!         Some("replica")
16//!     }
17//! }
18//! ```
19
20use crate::model::ModelMeta;
21
22/// Chooses the database alias for a model. Every hook has a neutral default.
23pub trait DatabaseRouter: Send + Sync + 'static {
24    /// Alias to read `model` from; `None` means the default database.
25    fn db_for_read(&self, model: &ModelMeta) -> Option<&str> {
26        let _ = model;
27        None
28    }
29
30    /// Alias to write `model` to; `None` means the default database.
31    fn db_for_write(&self, model: &ModelMeta) -> Option<&str> {
32        let _ = model;
33        None
34    }
35
36    /// Whether migrations may create `model`'s table on database `alias`.
37    fn allow_migrate(&self, alias: &str, model: &ModelMeta) -> bool {
38        let _ = (alias, model);
39        true
40    }
41}