1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
//! Types related to describing schema, and interactions between tables. //! //! Most traits in this module are derived or generated by [`table!`]. //! //! [`table!`]: ../macro.table.html #[doc(hidden)] pub mod joins; mod peano_numbers; use expression::{Expression, NonAggregate, SelectableExpression}; use query_builder::*; pub use self::joins::JoinTo; pub use self::peano_numbers::*; #[cfg(feature = "with-deprecated")] #[deprecated(since = "1.1.0", note = "Use `deserialize::Queryable` instead")] pub use deserialize::Queryable; #[cfg(feature = "with-deprecated")] #[deprecated(since = "1.1.0", note = "Use `deserialize::QueryableByName` instead")] pub use deserialize::QueryableByName; /// Represents a type which can appear in the `FROM` clause. Apps should not /// need to concern themselves with this trait. /// /// Types which implement this trait include: /// - Tables generated by the `table!` macro /// - Internal structs which represent joins /// - A select statement which has had no query builder methods called on it, /// other than those which can affect the from clause. pub trait QuerySource { /// The type returned by `from_clause` type FromClause; /// The type returned by `default_selection` type DefaultSelection: SelectableExpression<Self>; /// The actual `FROM` clause of this type. This is typically only called in /// `QueryFragment` implementations. fn from_clause(&self) -> Self::FromClause; /// The default select clause of this type, which should be used if no /// select clause was explicitly specified. This should always be a tuple of /// all the desired columns, not `star` fn default_selection(&self) -> Self::DefaultSelection; } /// A column on a database table. Types which implement this trait should have /// been generated by the [`table!` macro](../macro.table.html). pub trait Column: Expression { /// The table which this column belongs to type Table: Table; /// The name of this column const NAME: &'static str; } /// A SQL database table. Types which implement this trait should have been /// generated by the [`table!` macro](../macro.table.html). pub trait Table: QuerySource + AsQuery + Sized { /// The type returned by `primary_key` type PrimaryKey: SelectableExpression<Self> + NonAggregate; /// The type returned by `all_columns` type AllColumns: SelectableExpression<Self> + NonAggregate; /// Returns the primary key of this table. /// /// If the table has a composite primary key, this will be a tuple. fn primary_key(&self) -> Self::PrimaryKey; /// Returns a tuple of all columns belonging to this table. fn all_columns() -> Self::AllColumns; } /// Determines how many times `Self` appears in `QS` /// /// This trait is primarily used to determine whether or not a column is /// selectable from a given from clause. A column can be selected if its table /// appears in the from clause *exactly once*. /// /// We do not allow the same table to appear in a query multiple times in any /// context where referencing that table would be ambiguous (depending on the /// context and backend being used, this may or may not be something that would /// otherwise result in a runtime error). pub trait AppearsInFromClause<QS> { /// How many times does `Self` appear in `QS`? type Count; }