Skip to main content

diesel/associations/
mod.rs

1//! Traits related to relationships between multiple tables.
2//!
3//! Associations in Diesel are always child-to-parent.
4//! You can declare an association between two records with `#[diesel(belongs_to)]`.
5//! Unlike other ORMs, Diesel has no concept of `has many`
6//!
7//! ```rust
8//! # include!("../doctest_setup.rs");
9//! use schema::{posts, users};
10//!
11//! #[derive(Identifiable, Queryable, PartialEq, Debug)]
12//! #[diesel(table_name = users)]
13//! pub struct User {
14//!     id: i32,
15//!     name: String,
16//! }
17//!
18//! #[derive(Identifiable, Queryable, Associations, PartialEq, Debug)]
19//! #[diesel(belongs_to(User))]
20//! #[diesel(table_name = posts)]
21//! pub struct Post {
22//!     id: i32,
23//!     user_id: i32,
24//!     title: String,
25//! }
26//!
27//! # fn main() {
28//! #     run_test().unwrap();
29//! # }
30//! #
31//! # fn run_test() -> QueryResult<()> {
32//! #     let connection = &mut establish_connection();
33//! #     use self::users::dsl::*;
34//! let user = users.find(2).get_result::<User>(connection)?;
35//! let users_post = Post::belonging_to(&user).first(connection)?;
36//! let expected = Post {
37//!     id: 3,
38//!     user_id: 2,
39//!     title: "My first post too".into(),
40//! };
41//! assert_eq!(expected, users_post);
42//! #     Ok(())
43//! # }
44//! ```
45//!
46//! Note that in addition to the `#[diesel(belongs_to)]` annotation, we also need to
47//! `#[derive(Associations)]`
48//!
49//! `#[diesel(belongs_to)]` is given the name of the struct that represents the parent.
50//! Both the parent and child must implement [`Identifiable`].
51//! The struct given to `#[diesel(belongs_to)]` must be in scope,
52//! so you will need `use some_module::User` if `User` is defined in another module.
53//!
54//! If the parent record is generic over lifetimes, they can be written as `'_`.
55//! You will also need to wrap the type in quotes until
56//! `unrestricted_attribute_tokens` is stable.
57//!
58//! ```rust
59//! # include!("../doctest_setup.rs");
60//! # use schema::{posts, users};
61//! # use std::borrow::Cow;
62//! #
63//! #[derive(Identifiable)]
64//! #[diesel(table_name = users)]
65//! pub struct User<'a> {
66//!     id: i32,
67//!     name: Cow<'a, str>,
68//! }
69//!
70//! #[derive(Associations)]
71//! #[diesel(belongs_to(User<'_>))]
72//! #[diesel(table_name = posts)]
73//! pub struct Post {
74//!     id: i32,
75//!     user_id: i32,
76//!     title: String,
77//! }
78//! #
79//! # fn main() {}
80//! ```
81//!
82//!
83//! By default, Diesel assumes that your foreign keys will follow the convention `table_name_id`.
84//! If your foreign key has a different name,
85//! you can provide the `foreign_key` argument to `#[diesel(belongs_to)]`.
86//! For example, `#[diesel(belongs_to(Foo, foreign_key = mykey))]`.
87//!
88//! Associated data is typically loaded in multiple queries (one query per table).
89//! This is usually more efficient than using a join,
90//! especially if 3 or more tables are involved.
91//! For most datasets,
92//! using a join to load in a single query transmits so much duplicate data
93//! that it costs more time than the extra round trip would have.
94//!
95//! You can load the children for one or more parents using
96//! [`belonging_to`]
97//!
98//! [`belonging_to`]: crate::query_dsl::BelongingToDsl::belonging_to
99//!
100//! ```rust
101//! # include!("../doctest_setup.rs");
102//! # use schema::users;
103//! # use schema::posts;
104//! #
105//! # #[derive(Debug, PartialEq, Identifiable, Queryable)]
106//! # pub struct User {
107//! #     id: i32,
108//! #     name: String,
109//! # }
110//! #
111//! # #[derive(Debug, PartialEq, Identifiable, Queryable, Associations)]
112//! # #[diesel(belongs_to(User))]
113//! # pub struct Post {
114//! #     id: i32,
115//! #     user_id: i32,
116//! #     title: String,
117//! # }
118//! #
119//! # fn main() {
120//! #   use self::users::dsl::*;
121//! #   let connection = &mut establish_connection();
122//! #
123//! let user = users
124//!     .find(1)
125//!     .first::<User>(connection)
126//!     .expect("Error loading user");
127//! let post_list = Post::belonging_to(&user)
128//!     .load::<Post>(connection)
129//!     .expect("Error loading posts");
130//! let expected = vec![
131//!     Post {
132//!         id: 1,
133//!         user_id: 1,
134//!         title: "My first post".to_string(),
135//!     },
136//!     Post {
137//!         id: 2,
138//!         user_id: 1,
139//!         title: "About Rust".to_string(),
140//!     },
141//! ];
142//!
143//! assert_eq!(post_list, expected);
144//! # }
145//! ```
146//!
147//! If you're coming from other ORMs, you'll notice that this design is quite different from most.
148//! There you would have an instance method on the parent, or have the children stored somewhere on
149//! the posts. This design leads to many problems, including [N+1 query
150//! bugs][load-your-entire-database-into-memory-lol], and runtime errors when accessing an
151//! association that isn't there.
152//!
153//! [load-your-entire-database-into-memory-lol]: https://stackoverflow.com/q/97197/1254484
154//!
155//! In Diesel, data and its associations are considered to be separate. If you want to pass around
156//! a user and all of its posts, that type is `(User, Vec<Post>)`.
157//!
158//! Next lets look at how to load the children for more than one parent record.
159//! [`belonging_to`] can be used to load the data, but we'll also need to group it
160//! with its parents. For this we use an additional method [`grouped_by`].
161//!
162//! [`grouped_by`]: GroupedBy::grouped_by
163//! [`belonging_to`]: crate::query_dsl::BelongingToDsl::belonging_to
164//!
165//! [`belonging_to`] accepts a single parent or a collection of them,
166//! and its documentation carries a runnable example.
167//!
168//! Typically you will want to group up the children with their parents.
169//! In other ORMs, this is often called a `has_many` relationship.
170//! Diesel provides support for doing this grouping, once the data has been
171//! loaded.
172//!
173//! [`grouped_by`] is called on a `Vec<Child>` with a `&[Parent]`.
174//! The return value will be `Vec<Vec<Child>>` indexed to match their parent.
175//! Or to put it another way, the returned data can be passed to `zip`,
176//! and it will be combined with its parent.
177//!
178//! A runnable example lives on [`GroupedBy`].
179//!
180//! [`grouped_by`] can be called multiple times
181//! if you have multiple children or grandchildren.
182//!
183//! For example, this code will load some users,
184//! all of their posts,
185//! and all of the comments on those posts.
186//! Explicit type annotations have been added
187//! to make each line a bit more clear.
188//!
189//! ```rust
190//! # include!("../doctest_setup.rs");
191//! # use schema::{users, posts, comments};
192//! #
193//! # #[derive(Debug, PartialEq, Identifiable, Queryable)]
194//! # pub struct User {
195//! #     id: i32,
196//! #     name: String,
197//! # }
198//! #
199//! # #[derive(Debug, PartialEq, Identifiable, Queryable, Associations)]
200//! # #[diesel(belongs_to(User))]
201//! # pub struct Post {
202//! #     id: i32,
203//! #     user_id: i32,
204//! #     title: String,
205//! # }
206//! #
207//! # #[derive(Debug, PartialEq, Identifiable, Queryable, Associations)]
208//! # #[diesel(belongs_to(Post))]
209//! # pub struct Comment {
210//! #     id: i32,
211//! #     post_id: i32,
212//! #     body: String,
213//! # }
214//! #
215//! # fn main() {
216//! #   let connection = &mut establish_connection();
217//! #
218//! let users: Vec<User> = users::table
219//!     .load::<User>(connection)
220//!     .expect("error loading users");
221//! let posts: Vec<Post> = Post::belonging_to(&users)
222//!     .load::<Post>(connection)
223//!     .expect("error loading posts");
224//! let comments: Vec<Comment> = Comment::belonging_to(&posts)
225//!     .load::<Comment>(connection)
226//!     .expect("Error loading comments");
227//! let grouped_comments: Vec<Vec<Comment>> = comments.grouped_by(&posts);
228//! let posts_and_comments: Vec<Vec<(Post, Vec<Comment>)>> =
229//!     posts.into_iter().zip(grouped_comments).grouped_by(&users);
230//! let result: Vec<(User, Vec<(Post, Vec<Comment>)>)> =
231//!     users.into_iter().zip(posts_and_comments).collect();
232//! let expected = vec![
233//!     (
234//!         User {
235//!             id: 1,
236//!             name: "Sean".to_string(),
237//!         },
238//!         vec![
239//!             (
240//!                 Post {
241//!                     id: 1,
242//!                     user_id: 1,
243//!                     title: "My first post".to_string(),
244//!                 },
245//!                 vec![Comment {
246//!                     id: 1,
247//!                     post_id: 1,
248//!                     body: "Great post".to_string(),
249//!                 }],
250//!             ),
251//!             (
252//!                 Post {
253//!                     id: 2,
254//!                     user_id: 1,
255//!                     title: "About Rust".to_string(),
256//!                 },
257//!                 vec![Comment {
258//!                     id: 2,
259//!                     post_id: 2,
260//!                     body: "Yay! I am learning Rust".to_string(),
261//!                 }],
262//!             ),
263//!         ],
264//!     ),
265//!     (
266//!         User {
267//!             id: 2,
268//!             name: "Tess".to_string(),
269//!         },
270//!         vec![(
271//!             Post {
272//!                 id: 3,
273//!                 user_id: 2,
274//!                 title: "My first post too".to_string(),
275//!             },
276//!             vec![Comment {
277//!                 id: 3,
278//!                 post_id: 3,
279//!                 body: "I enjoyed your post".to_string(),
280//!             }],
281//!         )],
282//!     ),
283//! ];
284//!
285//! assert_eq!(result, expected);
286//! # }
287//! ```
288//!
289//! And that's it.
290//! It may seem odd to have load, group, and zip be explicit separate steps
291//! if you are coming from another ORM.
292//! However, the goal is to provide simple building blocks which can
293//! be used to construct the complex behavior applications need.
294mod belongs_to;
295
296use core::hash::Hash;
297
298use crate::query_source::Table;
299
300pub use self::belongs_to::{BelongsTo, GroupedBy, TryGroupedByError};
301
302#[doc(inline)]
303pub use diesel_derives::Associations;
304
305/// This trait indicates that a struct is associated with a single database table.
306///
307/// This trait is implemented by structs which implement `Identifiable`,
308/// as well as database tables themselves.
309pub trait HasTable {
310    /// The table this type is associated with.
311    type Table: Table;
312
313    /// Returns the table this type is associated with.
314    fn table() -> Self::Table;
315}
316
317impl<T: HasTable> HasTable for &T {
318    type Table = T::Table;
319
320    fn table() -> Self::Table {
321        T::table()
322    }
323}
324
325impl<T: HasTable> HasTable for Option<T> {
326    type Table = T::Table;
327
328    fn table() -> Self::Table {
329        T::table()
330    }
331}
332
333impl<T: HasTable> HasTable for alloc::boxed::Box<T> {
334    type Table = T::Table;
335
336    fn table() -> Self::Table {
337        T::table()
338    }
339}
340
341impl<T: HasTable> HasTable for alloc::rc::Rc<T> {
342    type Table = T::Table;
343
344    fn table() -> Self::Table {
345        T::table()
346    }
347}
348
349impl<T: HasTable> HasTable for alloc::sync::Arc<T> {
350    type Table = T::Table;
351
352    fn table() -> Self::Table {
353        T::table()
354    }
355}
356
357// Implement HasTable for tuples of types which implement `HasTable` for
358// the same table.
359// This is useful for multi-column constraints like composite foreign keys.
360//
361// For example:
362// ```rust,ignore
363// // Given a table with columns (id, name)
364// type UserTable = <(users::id, users::name) as HasTable>::Table;
365// let table = <(users::id, users::name)>::table();
366// ```
367
368impl<T> HasTable for (T,)
369where
370    T: HasTable,
371{
372    type Table = T::Table;
373
374    fn table() -> Self::Table {
375        T::table()
376    }
377}
378
379macro_rules! has_table_tuples {
380    ($(
381        $Tuple:tt {
382            $(($idx:tt) -> $T:ident, $ST:ident, $TT:ident,)*
383        }
384    )+) => {
385        $(
386            impl<_T, $($T),*> HasTable for (_T, $($T),*)
387            where
388                _T: HasTable,
389                $($T: HasTable<Table = _T::Table>,)*
390            {
391                type Table = _T::Table;
392
393                fn table() -> Self::Table {
394                    _T::table()
395                }
396            }
397        )+
398    };
399}
400
401impl<_T, T> HasTable for (_T, T) where _T: HasTable,
    T: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1> HasTable for (_T, T, T1) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2> HasTable for (_T, T, T1, T2) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3> HasTable for (_T, T, T1, T2, T3) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4> HasTable for (_T, T, T1, T2, T3, T4) where
    _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5> HasTable for (_T, T, T1, T2, T3, T4, T5) where
    _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table>, T7: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table>, T7: HasTable<Table = _T::Table>,
    T8: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table>, T7: HasTable<Table = _T::Table>,
    T8: HasTable<Table = _T::Table>, T9: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table>, T7: HasTable<Table = _T::Table>,
    T8: HasTable<Table = _T::Table>, T9: HasTable<Table = _T::Table>,
    T10: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table>, T7: HasTable<Table = _T::Table>,
    T8: HasTable<Table = _T::Table>, T9: HasTable<Table = _T::Table>,
    T10: HasTable<Table = _T::Table>, T11: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) where
    _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> HasTable
    for (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) where
    _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table>,
    T13: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>
    HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) where
    _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table>,
    T13: HasTable<Table = _T::Table>, T14: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
    HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
    where _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table>,
    T13: HasTable<Table = _T::Table>, T14: HasTable<Table = _T::Table>,
    T15: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16) where _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table>,
    T13: HasTable<Table = _T::Table>, T14: HasTable<Table = _T::Table>,
    T15: HasTable<Table = _T::Table>, T16: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17) where _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table>,
    T13: HasTable<Table = _T::Table>, T14: HasTable<Table = _T::Table>,
    T15: HasTable<Table = _T::Table>, T16: HasTable<Table = _T::Table>,
    T17: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18) where _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table>,
    T13: HasTable<Table = _T::Table>, T14: HasTable<Table = _T::Table>,
    T15: HasTable<Table = _T::Table>, T16: HasTable<Table = _T::Table>,
    T17: HasTable<Table = _T::Table>, T18: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19) where _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table>,
    T13: HasTable<Table = _T::Table>, T14: HasTable<Table = _T::Table>,
    T15: HasTable<Table = _T::Table>, T16: HasTable<Table = _T::Table>,
    T17: HasTable<Table = _T::Table>, T18: HasTable<Table = _T::Table>,
    T19: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table>, T7: HasTable<Table = _T::Table>,
    T8: HasTable<Table = _T::Table>, T9: HasTable<Table = _T::Table>,
    T10: HasTable<Table = _T::Table>, T11: HasTable<Table = _T::Table>,
    T12: HasTable<Table = _T::Table>, T13: HasTable<Table = _T::Table>,
    T14: HasTable<Table = _T::Table>, T15: HasTable<Table = _T::Table>,
    T16: HasTable<Table = _T::Table>, T17: HasTable<Table = _T::Table>,
    T18: HasTable<Table = _T::Table>, T19: HasTable<Table = _T::Table>,
    T20: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table>, T7: HasTable<Table = _T::Table>,
    T8: HasTable<Table = _T::Table>, T9: HasTable<Table = _T::Table>,
    T10: HasTable<Table = _T::Table>, T11: HasTable<Table = _T::Table>,
    T12: HasTable<Table = _T::Table>, T13: HasTable<Table = _T::Table>,
    T14: HasTable<Table = _T::Table>, T15: HasTable<Table = _T::Table>,
    T16: HasTable<Table = _T::Table>, T17: HasTable<Table = _T::Table>,
    T18: HasTable<Table = _T::Table>, T19: HasTable<Table = _T::Table>,
    T20: HasTable<Table = _T::Table>, T21: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table>, T7: HasTable<Table = _T::Table>,
    T8: HasTable<Table = _T::Table>, T9: HasTable<Table = _T::Table>,
    T10: HasTable<Table = _T::Table>, T11: HasTable<Table = _T::Table>,
    T12: HasTable<Table = _T::Table>, T13: HasTable<Table = _T::Table>,
    T14: HasTable<Table = _T::Table>, T15: HasTable<Table = _T::Table>,
    T16: HasTable<Table = _T::Table>, T17: HasTable<Table = _T::Table>,
    T18: HasTable<Table = _T::Table>, T19: HasTable<Table = _T::Table>,
    T20: HasTable<Table = _T::Table>, T21: HasTable<Table = _T::Table>,
    T22: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table>, T7: HasTable<Table = _T::Table>,
    T8: HasTable<Table = _T::Table>, T9: HasTable<Table = _T::Table>,
    T10: HasTable<Table = _T::Table>, T11: HasTable<Table = _T::Table>,
    T12: HasTable<Table = _T::Table>, T13: HasTable<Table = _T::Table>,
    T14: HasTable<Table = _T::Table>, T15: HasTable<Table = _T::Table>,
    T16: HasTable<Table = _T::Table>, T17: HasTable<Table = _T::Table>,
    T18: HasTable<Table = _T::Table>, T19: HasTable<Table = _T::Table>,
    T20: HasTable<Table = _T::Table>, T21: HasTable<Table = _T::Table>,
    T22: HasTable<Table = _T::Table>, T23: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table>, T7: HasTable<Table = _T::Table>,
    T8: HasTable<Table = _T::Table>, T9: HasTable<Table = _T::Table>,
    T10: HasTable<Table = _T::Table>, T11: HasTable<Table = _T::Table>,
    T12: HasTable<Table = _T::Table>, T13: HasTable<Table = _T::Table>,
    T14: HasTable<Table = _T::Table>, T15: HasTable<Table = _T::Table>,
    T16: HasTable<Table = _T::Table>, T17: HasTable<Table = _T::Table>,
    T18: HasTable<Table = _T::Table>, T19: HasTable<Table = _T::Table>,
    T20: HasTable<Table = _T::Table>, T21: HasTable<Table = _T::Table>,
    T22: HasTable<Table = _T::Table>, T23: HasTable<Table = _T::Table>,
    T24: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table>, T7: HasTable<Table = _T::Table>,
    T8: HasTable<Table = _T::Table>, T9: HasTable<Table = _T::Table>,
    T10: HasTable<Table = _T::Table>, T11: HasTable<Table = _T::Table>,
    T12: HasTable<Table = _T::Table>, T13: HasTable<Table = _T::Table>,
    T14: HasTable<Table = _T::Table>, T15: HasTable<Table = _T::Table>,
    T16: HasTable<Table = _T::Table>, T17: HasTable<Table = _T::Table>,
    T18: HasTable<Table = _T::Table>, T19: HasTable<Table = _T::Table>,
    T20: HasTable<Table = _T::Table>, T21: HasTable<Table = _T::Table>,
    T22: HasTable<Table = _T::Table>, T23: HasTable<Table = _T::Table>,
    T24: HasTable<Table = _T::Table>, T25: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26) where _T: HasTable,
    T: HasTable<Table = _T::Table>, T1: HasTable<Table = _T::Table>,
    T2: HasTable<Table = _T::Table>, T3: HasTable<Table = _T::Table>,
    T4: HasTable<Table = _T::Table>, T5: HasTable<Table = _T::Table>,
    T6: HasTable<Table = _T::Table>, T7: HasTable<Table = _T::Table>,
    T8: HasTable<Table = _T::Table>, T9: HasTable<Table = _T::Table>,
    T10: HasTable<Table = _T::Table>, T11: HasTable<Table = _T::Table>,
    T12: HasTable<Table = _T::Table>, T13: HasTable<Table = _T::Table>,
    T14: HasTable<Table = _T::Table>, T15: HasTable<Table = _T::Table>,
    T16: HasTable<Table = _T::Table>, T17: HasTable<Table = _T::Table>,
    T18: HasTable<Table = _T::Table>, T19: HasTable<Table = _T::Table>,
    T20: HasTable<Table = _T::Table>, T21: HasTable<Table = _T::Table>,
    T22: HasTable<Table = _T::Table>, T23: HasTable<Table = _T::Table>,
    T24: HasTable<Table = _T::Table>, T25: HasTable<Table = _T::Table>,
    T26: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27) where
    _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table>,
    T13: HasTable<Table = _T::Table>, T14: HasTable<Table = _T::Table>,
    T15: HasTable<Table = _T::Table>, T16: HasTable<Table = _T::Table>,
    T17: HasTable<Table = _T::Table>, T18: HasTable<Table = _T::Table>,
    T19: HasTable<Table = _T::Table>, T20: HasTable<Table = _T::Table>,
    T21: HasTable<Table = _T::Table>, T22: HasTable<Table = _T::Table>,
    T23: HasTable<Table = _T::Table>, T24: HasTable<Table = _T::Table>,
    T25: HasTable<Table = _T::Table>, T26: HasTable<Table = _T::Table>,
    T27: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> HasTable
    for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28) where
    _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table>,
    T13: HasTable<Table = _T::Table>, T14: HasTable<Table = _T::Table>,
    T15: HasTable<Table = _T::Table>, T16: HasTable<Table = _T::Table>,
    T17: HasTable<Table = _T::Table>, T18: HasTable<Table = _T::Table>,
    T19: HasTable<Table = _T::Table>, T20: HasTable<Table = _T::Table>,
    T21: HasTable<Table = _T::Table>, T22: HasTable<Table = _T::Table>,
    T23: HasTable<Table = _T::Table>, T24: HasTable<Table = _T::Table>,
    T25: HasTable<Table = _T::Table>, T26: HasTable<Table = _T::Table>,
    T27: HasTable<Table = _T::Table>, T28: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29>
    HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29)
    where _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table>,
    T13: HasTable<Table = _T::Table>, T14: HasTable<Table = _T::Table>,
    T15: HasTable<Table = _T::Table>, T16: HasTable<Table = _T::Table>,
    T17: HasTable<Table = _T::Table>, T18: HasTable<Table = _T::Table>,
    T19: HasTable<Table = _T::Table>, T20: HasTable<Table = _T::Table>,
    T21: HasTable<Table = _T::Table>, T22: HasTable<Table = _T::Table>,
    T23: HasTable<Table = _T::Table>, T24: HasTable<Table = _T::Table>,
    T25: HasTable<Table = _T::Table>, T26: HasTable<Table = _T::Table>,
    T27: HasTable<Table = _T::Table>, T28: HasTable<Table = _T::Table>,
    T29: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30>
    HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30)
    where _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table>,
    T13: HasTable<Table = _T::Table>, T14: HasTable<Table = _T::Table>,
    T15: HasTable<Table = _T::Table>, T16: HasTable<Table = _T::Table>,
    T17: HasTable<Table = _T::Table>, T18: HasTable<Table = _T::Table>,
    T19: HasTable<Table = _T::Table>, T20: HasTable<Table = _T::Table>,
    T21: HasTable<Table = _T::Table>, T22: HasTable<Table = _T::Table>,
    T23: HasTable<Table = _T::Table>, T24: HasTable<Table = _T::Table>,
    T25: HasTable<Table = _T::Table>, T26: HasTable<Table = _T::Table>,
    T27: HasTable<Table = _T::Table>, T28: HasTable<Table = _T::Table>,
    T29: HasTable<Table = _T::Table>, T30: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}
impl<_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
    T31> HasTable for
    (_T, T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
    T31) where _T: HasTable, T: HasTable<Table = _T::Table>,
    T1: HasTable<Table = _T::Table>, T2: HasTable<Table = _T::Table>,
    T3: HasTable<Table = _T::Table>, T4: HasTable<Table = _T::Table>,
    T5: HasTable<Table = _T::Table>, T6: HasTable<Table = _T::Table>,
    T7: HasTable<Table = _T::Table>, T8: HasTable<Table = _T::Table>,
    T9: HasTable<Table = _T::Table>, T10: HasTable<Table = _T::Table>,
    T11: HasTable<Table = _T::Table>, T12: HasTable<Table = _T::Table>,
    T13: HasTable<Table = _T::Table>, T14: HasTable<Table = _T::Table>,
    T15: HasTable<Table = _T::Table>, T16: HasTable<Table = _T::Table>,
    T17: HasTable<Table = _T::Table>, T18: HasTable<Table = _T::Table>,
    T19: HasTable<Table = _T::Table>, T20: HasTable<Table = _T::Table>,
    T21: HasTable<Table = _T::Table>, T22: HasTable<Table = _T::Table>,
    T23: HasTable<Table = _T::Table>, T24: HasTable<Table = _T::Table>,
    T25: HasTable<Table = _T::Table>, T26: HasTable<Table = _T::Table>,
    T27: HasTable<Table = _T::Table>, T28: HasTable<Table = _T::Table>,
    T29: HasTable<Table = _T::Table>, T30: HasTable<Table = _T::Table>,
    T31: HasTable<Table = _T::Table> {
    type Table = _T::Table;
    fn table() -> Self::Table { _T::table() }
}crate::for_each_tuple!(has_table_tuples);
402
403/// This trait indicates that a struct represents a single row in a database table.
404///
405/// This must be implemented to use associations.
406/// Additionally, implementing this trait allows you to pass your struct to `update`
407/// (`update(&your_struct)` is equivalent to
408/// `update(YourStruct::table().find(&your_struct.primary_key())`).
409///
410/// This trait is usually implemented on a reference to a struct,
411/// not on the struct itself. It can be [derived](derive@Identifiable).
412pub trait Identifiable: HasTable {
413    /// The type of this struct's identifier.
414    ///
415    /// For single-field primary keys, this is typically `&'a i32`, or `&'a String`
416    /// For composite primary keys, this is typically `(&'a i32, &'a i32)`
417    /// or `(&'a String, &'a String)`, etc.
418    type Id: Hash + Eq;
419
420    /// Returns the identifier for this record.
421    ///
422    /// This takes `self` by value, not reference.
423    /// This is because composite primary keys
424    /// are typically stored as multiple fields.
425    /// We could not return `&(String, String)` if each string is a separate field.
426    ///
427    /// Because of Rust's rules about specifying lifetimes,
428    /// this means that `Identifiable` is usually implemented on references
429    /// so that we have a lifetime to use for `Id`.
430    fn id(self) -> Self::Id;
431}
432
433#[doc(inline)]
434pub use diesel_derives::Identifiable;