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}