1#![cfg_attr(not(feature = "std"), no_std)]
2//! # Diesel
3//!
4//! Diesel is an ORM and query builder designed to reduce the boilerplate for database interactions.
5//! If this is your first time reading this documentation,
6//! we recommend you start with the [getting started guide].
7//! We also have [many other long form guides].
8//!
9//! [getting started guide]: https://diesel.rs/guides/getting-started/
10//! [many other long form guides]: https://diesel.rs/guides
11//!
12//! # Where to find things
13//!
14//! ## Declaring your schema
15//!
16//! For Diesel to validate your queries at compile time
17//! it requires you to specify your schema in your code,
18//! which you can do with [the `table!` macro][`table!`].
19//! `diesel print-schema` can be used
20//! to automatically generate these macro calls
21//! (by connecting to your database and querying its schema).
22//!
23//!
24//! ## Getting started
25//!
26//! Queries usually start from either a table, or a function like [`update`].
27//! Those functions can be found [here](#functions).
28//!
29//! Diesel provides a [`prelude` module](prelude),
30//! which exports most of the typically used traits and types.
31//! We are conservative about what goes in this module,
32//! and avoid anything which has a generic name.
33//! Files which use Diesel are expected to have `use diesel::prelude::*;`.
34//!
35//! [`update`]: update()
36//!
37//! ## Constructing a query
38//!
39//! The tools the query builder gives you can be put into these three categories:
40//!
41//! - "Query builder methods" are things that map to portions of a whole query
42//! (such as `ORDER` and `WHERE`). These methods usually have the same name
43//! as the SQL they map to, except for `WHERE` which is called `filter` in Diesel
44//! (To not conflict with the Rust keyword).
45//! These methods live in [the `query_dsl` module](query_dsl).
46//! - "Expression methods" are things you would call on columns
47//! or other individual values.
48//! These methods live in [the `expression_methods` module](expression_methods)
49//! You can often find these by thinking "what would this be called"
50//! if it were a method
51//! and typing that into the search bar
52//! (e.g. `LIKE` is called `like` in Diesel).
53//! Most operators are named based on the Rust function which maps to that
54//! operator in [`std::ops`][]
55//! (For example `==` is called `.eq`, and `!=` is called `.ne`).
56//! - "Bare functions" are normal SQL functions
57//! such as `sum`.
58//! They live in [the `dsl` module](dsl).
59//! Diesel only supports a very small number of these functions.
60//! You can declare additional functions you want to use
61//! with [the `define_sql_function!` macro][`define_sql_function!`].
62//!
63//! [`std::ops`]: //doc.rust-lang.org/stable/std/ops/index.html
64//!
65//! ## Serializing and Deserializing
66//!
67//! Types which represent the result of a SQL query implement
68//! a trait called [`Queryable`].
69//!
70//! Diesel maps "Rust types" (e.g. `i32`) to and from "SQL types"
71//! (e.g. [`diesel::sql_types::Integer`]).
72//! You can find all the types supported by Diesel in [the `sql_types` module](sql_types).
73//! These types are only used to represent a SQL type.
74//! You should never put them on your `Queryable` structs.
75//!
76//! To find all the Rust types which can be used with a given SQL type,
77//! see the documentation for that SQL type.
78//!
79//! To find all the SQL types which can be used with a Rust type,
80//! go to the docs for either [`ToSql`] or [`FromSql`],
81//! go to the "Implementors" section,
82//! and find the Rust type you want to use.
83//!
84//! [`Queryable`]: deserialize::Queryable
85//! [`diesel::sql_types::Integer`]: sql_types::Integer
86//! [`ToSql`]: serialize::ToSql
87//! [`FromSql`]: deserialize::FromSql
88//!
89//! ## How to read diesels compile time error messages
90//!
91//! Diesel is known for generating large complicated looking errors. Usually
92//! most of these error messages can be broken down easily. The following
93//! section tries to give an overview of common error messages and how to read them.
94//! As a general note it's always useful to read the complete error message as emitted
95//! by rustc, including the `required because of …` part of the message.
96//! Your IDE might hide important parts!
97//!
98//! The following error messages are common:
99//!
100//! * `the trait bound (diesel::sql_types::Integer, …, diesel::sql_types::Text): load_dsl::private::CompatibleType<YourModel, Pg> is not satisfied`
101//! while trying to execute a query:
102//! This error indicates a mismatch between what your query returns and what your model struct
103//! expects the query to return. The fields need to match in terms of field order, field type
104//! and field count. If you are sure that everything matches, double check the enabled diesel
105//! features (for support for types from other crates) and double check (via `cargo tree`)
106//! that there is only one version of such a shared crate in your dependency tree.
107//! Consider using [`#[derive(Selectable)]`](derive@crate::prelude::Selectable) +
108//! `#[diesel(check_for_backend(diesel::pg::Pg))]`
109//! to improve the generated error message.
110//! * `the trait bound i32: diesel::Expression is not satisfied` in the context of `Insertable`
111//! model structs:
112//! This error indicates a type mismatch between the field you are trying to insert into the database
113//! and the actual database type. These error messages contain a line
114//! like ` = note: required for i32 to implement AsExpression<diesel::sql_types::Text>`
115//! that show both the provided rust side type (`i32` in that case) and the expected
116//! database side type (`Text` in that case).
117//! * `the trait bound i32: AppearsOnTable<users::table> is not satisfied` in the context of `AsChangeset`
118//! model structs:
119//! This error indicates a type mismatch between the field you are trying to update and the actual
120//! database type. Double check your type mapping.
121//! * `the trait bound SomeLargeType: QueryFragment<Sqlite, SomeMarkerType> is not satisfied` while
122//! trying to execute a query.
123//! This error message indicates that a given query is not supported by your backend. This usually
124//! means that you are trying to use SQL features from one SQL dialect on a different database
125//! system. Double check your query that everything required is supported by the selected
126//! backend. If that's the case double check that the relevant feature flags are enabled
127//! (for example, `returning_clauses_for_sqlite_3_35` for enabling support for returning clauses in newer
128//! sqlite versions)
129//! * `the trait bound posts::title: SelectableExpression<users::table> is not satisfied` while
130//! executing a query:
131//! This error message indicates that you're trying to select a field from a table
132//! that does not appear in your from clause. If your query joins the relevant table via
133//! [`left_join`](crate::query_dsl::QueryDsl::left_join) you need to call
134//! [`.nullable()`](crate::expression_methods::NullableExpressionMethods::nullable)
135//! on the relevant column in your select clause.
136//!
137//!
138//! ## Getting help
139//!
140//! If you run into problems, Diesel has an active community.
141//! Open a new [discussion] thread at diesel github repository
142//! and we will try to help you
143//!
144//! [discussion]: https://github.com/diesel-rs/diesel/discussions/categories/q-a
145//!
146//! # Crate feature flags
147//!
148//! The following feature flags are considered to be part of diesels public
149//! API. Any feature flag that is not listed here is **not** considered to
150//! be part of the public API and can disappear at any point in time:
151152//!
153//! - `sqlite`: This feature enables the diesel sqlite backend. Enabling this feature requires per default
154//! a compatible copy of `libsqlite3` for your target architecture. Alternatively, you can add `libsqlite3-sys`
155//! with the `bundled` feature as a dependency to your crate so SQLite will be bundled:
156//! ```toml
157//! [dependencies]
158//! libsqlite3-sys = { version = "0.29", features = ["bundled"] }
159//! ```
160//! - `sqlite-no-std` A diesel sqlite backend for no-std environments. This is mostly the same as the `sqlite` backend,
161//! but it doesn't enable the `std` feature flag
162//! - `postgres`: This feature enables the diesel postgres backend. This features implies `postgres_backend`
163//! Enabling this feature requires a compatible copy of `libpq` for your target architecture.
164//! Alternatively, you can add `pq-sys` with the `bundled` feature as a dependency to your
165//! crate so libpq will be bundled:
166//! ```toml
167//! [dependencies]
168//! pq-sys = { version = "0.6", features = ["bundled"] }
169//! openssl-sys = { version = "0.9.100", features = ["vendored"] }
170//! ```
171//! - `mysql`: This feature enables the diesel mysql backend. This feature implies `mysql_backend`.
172//! Enabling this feature requires a compatible copy of `libmysqlclient` for your target architecture.
173//! Alternatively, you can add `mysqlclient-sys` with the `bundled` feature as a dependency to your
174//! crate so libmysqlclient will be bundled:
175//! ```toml
176//! [dependencies]
177//! mysqlclient-sys = { version = "0.5", features = ["bundled"] }
178//! openssl-sys = { version = "0.9.100", features = ["vendored"] }
179//! ```
180//! - `postgres_backend`: This feature enables those parts of diesels postgres backend, that are not dependent
181//! on `libpq`. Diesel does not provide any connection implementation with only this feature enabled.
182//! This feature can be used to implement a custom implementation of diesels `Connection` trait for the
183//! postgres backend outside of diesel itself, while reusing the existing query dsl extensions for the
184//! postgres backend
185//! - `mysql_backend`: This feature enables those parts of diesels mysql backend, that are not dependent
186//! on `libmysqlclient`. Diesel does not provide any connection implementation with only this feature enabled.
187//! This feature can be used to implement a custom implementation of diesels `Connection` trait for the
188//! mysql backend outside of diesel itself, while reusing the existing query dsl extensions for the
189//! mysql backend
190//! - `returning_clauses_for_sqlite_3_35`: This feature enables support for `RETURNING` clauses in the sqlite backend.
191//! Enabling this feature requires sqlite 3.35.0 or newer.
192//! - `32-column-tables`: This feature enables support for tables with up to 32 columns.
193//! This feature is enabled by default. Consider disabling this feature if you write a library crate
194//! providing general extensions for diesel or if you do not need to support tables with more than 16 columns
195//! and you want to minimize your compile times.
196//! - `64-column-tables`: This feature enables support for tables with up to 64 columns. It implies the
197//! `32-column-tables` feature. Enabling this feature will increase your compile times.
198//! - `128-column-tables`: This feature enables support for tables with up to 128 columns. It implies the
199//! `64-column-tables` feature. Enabling this feature will increase your compile times significantly.
200//! - `i-implement-a-third-party-backend-and-opt-into-breaking-changes`: This feature opens up some otherwise
201//! private API, that can be useful to implement a third party [`Backend`](crate::backend::Backend)
202//! or write a custom [`Connection`] implementation. **Do not use this feature for
203//! any other usecase**. By enabling this feature you explicitly opt out diesel stability guarantees. We explicitly
204//! reserve us the right to break API's exported under this feature flag in any upcoming minor version release.
205//! If you publish a crate depending on this feature flag consider to restrict the supported diesel version to the
206//! currently released minor version.
207//! - `serde_json`: This feature flag enables support for (de)serializing json values from the database using
208//! types provided by `serde_json`.
209//! - `chrono`: This feature flags enables support for (de)serializing date/time values from the database using
210//! types provided by `chrono`
211//! - `uuid`: This feature flag enables support for (de)serializing uuid values from the database using types
212//! provided by `uuid`
213//! - `network-address`: This feature flag enables support for (de)serializing
214//! IP values from the database using types provided by `ipnetwork`.
215//! - `ipnet-address`: This feature flag enables support for (de)serializing IP
216//! values from the database using types provided by `ipnet`.
217//! - `numeric`: This feature flag enables support for (de)serializing numeric values from the database using types
218//! provided by `bigdecimal`
219//! - `r2d2`: This feature flag enables support for the `r2d2` connection pool implementation.
220//! - `extras`: This feature enables the feature flagged support for any third party crate. This implies the
221//! following feature flags: `serde_json`, `chrono`, `uuid`, `network-address`, `numeric`, `r2d2`
222//! - `with-deprecated`: This feature enables items marked as `#[deprecated]`. It is enabled by default.
223//! disabling this feature explicitly opts out diesels stability guarantee.
224//! - `without-deprecated`: This feature disables any item marked as `#[deprecated]`. Enabling this feature
225//! explicitly opts out the stability guarantee given by diesel. This feature overrides the `with-deprecated`.
226//! Note that this may also remove items that are not shown as `#[deprecated]` in our documentation, due to
227//! various bugs in rustdoc. It can be used to check if you depend on any such hidden `#[deprecated]` item.
228//! - `std`: This features enables usage of the rust standard library. When disabled Diesel will only use the `core`
229//! and `alloc` crate instead. If this feature is disabled it is required to enable the `hashbrown` feature.
230//! - `hashbrown`: This feature enables an optional dependency on the hashbrown crate. It's required for usage in `no_std`
231//! environments.
232//!
233//! By default the following features are enabled:
234//!
235//! - `with-deprecated`
236//! - `32-column-tables`
237//! - `std`
238239#![cfg_attr(feature = "unstable", feature(trait_alias))]
240#![cfg_attr(feature = "unstable", feature(strict_provenance_lints))]
241#![cfg_attr(
242 feature = "unstable",
243 warn(fuzzy_provenance_casts, lossy_provenance_casts)
244)]
245#![cfg_attr(diesel_docsrs, feature(doc_cfg, rustdoc_internals))]
246#![cfg_attr(diesel_docsrs, expect(internal_features))]
247#![cfg_attr(feature = "128-column-tables", recursion_limit = "256")]
248// Built-in Lints
249#![warn(
250 unreachable_pub,
251 missing_debug_implementations,
252 missing_copy_implementations,
253 elided_lifetimes_in_paths,
254 missing_docs
255)]
256// Clippy lints
257#![allow(
258 clippy::match_same_arms,
259 clippy::needless_doctest_main,
260 clippy::map_unwrap_or,
261 clippy::redundant_field_names,
262 clippy::type_complexity
263)]
264#![warn(
265 clippy::unwrap_used,
266 clippy::print_stdout,
267 clippy::mut_mut,
268 clippy::non_ascii_literal,
269 clippy::similar_names,
270 clippy::unicode_not_nfc,
271 clippy::enum_glob_use,
272 clippy::if_not_else,
273 clippy::items_after_statements,
274 clippy::used_underscore_binding,
275 clippy::cast_possible_wrap,
276 clippy::cast_possible_truncation,
277 clippy::cast_sign_loss
278)]
279#![cfg_attr(
280 not(test),
281 warn(clippy::std_instead_of_alloc, clippy::std_instead_of_core)
282)]
283#![deny(unsafe_code)]
284#![cfg_attr(test, allow(clippy::unwrap_used))]
285286// the no-std version needs hashbrown
287#[cfg(all(not(feature = "hashbrown"), not(feature = "std")))]
288compile_error!("The hashbrown feature is required for no-std support");
289290extern crate alloc;
291extern crate core;
292extern crate diesel_derives;
293294#[macro_use]
295#[doc(hidden)]
296pub mod macros;
297#[doc(hidden)]
298pub mod internal;
299300#[cfg(test)]
301#[macro_use]
302extern crate cfg_if;
303304#[cfg(test)]
305pub mod test_helpers;
306307pub mod associations;
308pub mod backend;
309pub mod collation;
310pub mod connection;
311pub mod data_types;
312pub mod deserialize;
313#[macro_use]
314pub mod expression;
315pub mod expression_methods;
316#[doc(hidden)]
317pub mod insertable;
318pub mod query_builder;
319pub mod query_dsl;
320pub mod query_source;
321#[cfg(feature = "r2d2")]
322pub mod r2d2;
323pub mod result;
324pub mod serialize;
325pub mod upsert;
326#[macro_use]
327pub mod sql_types;
328pub mod migration;
329pub mod row;
330331#[cfg(feature = "mysql_backend")]
332pub mod mysql;
333#[cfg(feature = "postgres_backend")]
334pub mod pg;
335#[cfg(feature = "__sqlite-shared")]
336pub mod sqlite;
337338#[macro_use]
339mod reexport_ambiguities;
340mod type_impls;
341mod util;
342343#[doc(hidden)]
344#[cfg(all(feature = "with-deprecated", not(feature = "without-deprecated")))]
345#[deprecated(since = "2.0.0", note = "Use explicit macro imports instead")]
346pub use diesel_derives::{
347AsChangeset, AsExpression, Associations, DieselNumericOps, FromSqlRow, Identifiable,
348Insertable, QueryId, Queryable, QueryableByName, SqlType,
349};
350351pub use diesel_derives::MultiConnection;
352353pub mod dsl {
354//! Includes various helper types and bare functions which are named too
355 //! generically to be included in prelude, but are often used when using Diesel.
356357#[allow(hidden_glob_reexports, non_camel_case_types, dead_code)]
mod helper_types_proxy {
#[doc(inline)]
pub use crate::helper_types::*;
type abbrev = ();
type array_append = ();
type array_cat = ();
type array_dims = ();
type array_fill_with_lower_bound = ();
type array_fill = ();
type array_length = ();
type array_lower = ();
type array_ndims = ();
type array_position_with_subscript = ();
type array_position = ();
type array_positions = ();
type array_prepend = ();
type array_remove = ();
type array_replace = ();
type array_sample = ();
type array_shuffle = ();
type array_to_json = ();
type array_to_string_with_null_string = ();
type array_to_string = ();
type array_upper = ();
type avg = ();
type broadcast = ();
type cardinality = ();
type daterange = ();
type family = ();
type first_value = ();
type host = ();
type hostmask = ();
type inet_merge = ();
type inet_same_family = ();
type int4range = ();
type int8range = ();
type isempty = ();
type json_array_length = ();
type json_build_array_0 = ();
type json_build_array_1 = ();
type json_build_array_2 = ();
type json_extract_path_1 = ();
type json_extract_path_2 = ();
type json_extract_path_text_1 = ();
type json_extract_path_text_2 = ();
type json_object_with_keys_and_values = ();
type json_object = ();
type json_populate_record = ();
type json_strip_nulls = ();
type json_typeof = ();
type jsonb_array_length = ();
type jsonb_build_array_0 = ();
type jsonb_build_array_1 = ();
type jsonb_build_array_2 = ();
type jsonb_extract_path_1 = ();
type jsonb_extract_path_2 = ();
type jsonb_extract_path_text_1 = ();
type jsonb_extract_path_text_2 = ();
type jsonb_insert_with_insert_after = ();
type jsonb_insert = ();
type jsonb_object_with_keys_and_values = ();
type jsonb_object = ();
type jsonb_populate_record = ();
type jsonb_pretty = ();
type jsonb_set_create_if_missing = ();
type jsonb_set_lax = ();
type jsonb_set = ();
type jsonb_strip_nulls = ();
type jsonb_typeof = ();
type lag_with_offset_and_default = ();
type lag_with_offset = ();
type lag = ();
type last_value = ();
type lead_with_offset_and_default = ();
type lead_with_offset = ();
type lead = ();
type lower_inc = ();
type lower_inf = ();
type lower = ();
type masklen = ();
type max = ();
type min = ();
type multirange_merge = ();
type netmask = ();
type network = ();
type nth_value = ();
type numrange = ();
type range_merge = ();
type row_to_json = ();
type set_masklen = ();
type sum = ();
type to_json = ();
type to_jsonb = ();
type trim_array = ();
type tsrange = ();
type tstzrange = ();
type upper_inc = ();
type upper_inf = ();
type upper = ();
type json = ();
type json_array_0 = ();
type json_array_1 = ();
type json_array_2 = ();
type json_array_length_with_path = ();
type json_error_position = ();
type json_group_array = ();
type json_group_object = ();
type json_object_0 = ();
type json_object_1 = ();
type json_object_2 = ();
type json_patch = ();
type json_pretty = ();
type json_pretty_with_indentation = ();
type json_quote = ();
type json_remove_0 = ();
type json_remove_1 = ();
type json_remove_2 = ();
type json_type = ();
type json_type_with_path = ();
type json_valid = ();
type json_valid_with_flags = ();
type jsonb = ();
type jsonb_array_0 = ();
type jsonb_array_1 = ();
type jsonb_array_2 = ();
type jsonb_group_array = ();
type jsonb_group_object = ();
type jsonb_object_0 = ();
type jsonb_object_1 = ();
type jsonb_object_2 = ();
type jsonb_patch = ();
type jsonb_remove_0 = ();
type jsonb_remove_1 = ();
type jsonb_remove_2 = ();
}make_proxy_mod!(helper_types_proxy, crate::helper_types);
358#[doc(inline)]
359pub use helper_types_proxy::*;
360361#[allow(hidden_glob_reexports, non_camel_case_types, dead_code)]
mod expression_dsl_proxy {
#[doc(inline)]
pub use crate::expression::dsl::*;
type abbrev = ();
type array_append = ();
type array_cat = ();
type array_dims = ();
type array_fill_with_lower_bound = ();
type array_fill = ();
type array_length = ();
type array_lower = ();
type array_ndims = ();
type array_position_with_subscript = ();
type array_position = ();
type array_positions = ();
type array_prepend = ();
type array_remove = ();
type array_replace = ();
type array_sample = ();
type array_shuffle = ();
type array_to_json = ();
type array_to_string_with_null_string = ();
type array_to_string = ();
type array_upper = ();
type avg = ();
type broadcast = ();
type cardinality = ();
type daterange = ();
type family = ();
type first_value = ();
type host = ();
type hostmask = ();
type inet_merge = ();
type inet_same_family = ();
type int4range = ();
type int8range = ();
type isempty = ();
type json_array_length = ();
type json_build_array_0 = ();
type json_build_array_1 = ();
type json_build_array_2 = ();
type json_extract_path_1 = ();
type json_extract_path_2 = ();
type json_extract_path_text_1 = ();
type json_extract_path_text_2 = ();
type json_object_with_keys_and_values = ();
type json_object = ();
type json_populate_record = ();
type json_strip_nulls = ();
type json_typeof = ();
type jsonb_array_length = ();
type jsonb_build_array_0 = ();
type jsonb_build_array_1 = ();
type jsonb_build_array_2 = ();
type jsonb_extract_path_1 = ();
type jsonb_extract_path_2 = ();
type jsonb_extract_path_text_1 = ();
type jsonb_extract_path_text_2 = ();
type jsonb_insert_with_insert_after = ();
type jsonb_insert = ();
type jsonb_object_with_keys_and_values = ();
type jsonb_object = ();
type jsonb_populate_record = ();
type jsonb_pretty = ();
type jsonb_set_create_if_missing = ();
type jsonb_set_lax = ();
type jsonb_set = ();
type jsonb_strip_nulls = ();
type jsonb_typeof = ();
type lag_with_offset_and_default = ();
type lag_with_offset = ();
type lag = ();
type last_value = ();
type lead_with_offset_and_default = ();
type lead_with_offset = ();
type lead = ();
type lower_inc = ();
type lower_inf = ();
type lower = ();
type masklen = ();
type max = ();
type min = ();
type multirange_merge = ();
type netmask = ();
type network = ();
type nth_value = ();
type numrange = ();
type range_merge = ();
type row_to_json = ();
type set_masklen = ();
type sum = ();
type to_json = ();
type to_jsonb = ();
type trim_array = ();
type tsrange = ();
type tstzrange = ();
type upper_inc = ();
type upper_inf = ();
type upper = ();
type json = ();
type json_array_0 = ();
type json_array_1 = ();
type json_array_2 = ();
type json_array_length_with_path = ();
type json_error_position = ();
type json_group_array = ();
type json_group_object = ();
type json_object_0 = ();
type json_object_1 = ();
type json_object_2 = ();
type json_patch = ();
type json_pretty = ();
type json_pretty_with_indentation = ();
type json_quote = ();
type json_remove_0 = ();
type json_remove_1 = ();
type json_remove_2 = ();
type json_type = ();
type json_type_with_path = ();
type json_valid = ();
type json_valid_with_flags = ();
type jsonb = ();
type jsonb_array_0 = ();
type jsonb_array_1 = ();
type jsonb_array_2 = ();
type jsonb_group_array = ();
type jsonb_group_object = ();
type jsonb_object_0 = ();
type jsonb_object_1 = ();
type jsonb_object_2 = ();
type jsonb_patch = ();
type jsonb_remove_0 = ();
type jsonb_remove_1 = ();
type jsonb_remove_2 = ();
}make_proxy_mod!(expression_dsl_proxy, crate::expression::dsl);
362#[doc(inline)]
363pub use expression_dsl_proxy::*;
364365#[doc(inline)]
366pub use crate::query_builder::functions::{
367delete, insert_into, insert_or_ignore_into, replace_into, select, sql_query, update,
368 };
369370#[doc(inline)]
371 #[cfg(feature = "postgres_backend")]
372pub use crate::query_builder::functions::{copy_from, copy_to};
373374#[doc(inline)]
375pub use diesel_derives::auto_type;
376377#[cfg(feature = "postgres_backend")]
378 #[doc(inline)]
379pub use crate::pg::expression::extensions::OnlyDsl;
380381#[cfg(feature = "postgres_backend")]
382 #[doc(inline)]
383pub use crate::pg::expression::extensions::TablesampleDsl;
384}
385386pub mod helper_types {
387//! Provide helper types for concisely writing the return type of functions.
388 //! As with iterators, it is unfortunately difficult to return a partially
389 //! constructed query without exposing the exact implementation of the
390 //! function. Without higher kinded types, these various DSLs can't be
391 //! combined into a single trait for boxing purposes.
392 //!
393 //! All types here are in the form `<FirstType as
394 //! DslName<OtherTypes>>::Output`. So the return type of
395 //! `users.filter(first_name.eq("John")).order(last_name.asc()).limit(10)` would
396 //! be `Limit<Order<FindBy<users, first_name, &str>, Asc<last_name>>>`
397use super::query_builder::combination_clause::{self, CombinationClause};
398use super::query_builder::{AsQuery, locking_clauseas lock};
399use super::query_dsl::methods::*;
400use super::query_dsl::*;
401use super::query_source::{aliasing, joins};
402use crate::dsl::CountStar;
403use crate::query_builder::select_clause::SelectClause;
404405#[doc(inline)]
406pub use crate::expression::helper_types::*;
407408/// Represents the return type of [`.select(selection)`](crate::prelude::QueryDsl::select)
409pub type Select<Source, Selection> = <Source as SelectDsl<Selection>>::Output;
410411/// Represents the return type of [`diesel::select(selection)`](crate::select)
412#[allow(non_camel_case_types)] // required for `#[auto_type]`
413pub type select<Selection> = crate::query_builder::SelectStatement<
414crate::query_builder::NoFromClause,
415SelectClause<Selection>,
416 >;
417418#[doc(hidden)]
419 #[deprecated(note = "Use `select` instead")]
420pub type BareSelect<Selection> = crate::query_builder::SelectStatement<
421crate::query_builder::NoFromClause,
422SelectClause<Selection>,
423 >;
424425/// Represents the return type of [`.filter(predicate)`](crate::prelude::QueryDsl::filter)
426pub type Filter<Source, Predicate> = <Source as FilterDsl<Predicate>>::Output;
427428/// Represents the return type of [`.filter(lhs.eq(rhs))`](crate::prelude::QueryDsl::filter)
429pub type FindBy<Source, Column, Value> = Filter<Source, Eq<Column, Value>>;
430431/// Represents the return type of [`.for_update()`](crate::prelude::QueryDsl::for_update)
432pub type ForUpdate<Source> = <Source as LockingDsl<lock::ForUpdate>>::Output;
433434/// Represents the return type of [`.for_no_key_update()`](crate::prelude::QueryDsl::for_no_key_update)
435pub type ForNoKeyUpdate<Source> = <Source as LockingDsl<lock::ForNoKeyUpdate>>::Output;
436437/// Represents the return type of [`.for_share()`](crate::prelude::QueryDsl::for_share)
438pub type ForShare<Source> = <Source as LockingDsl<lock::ForShare>>::Output;
439440/// Represents the return type of [`.for_key_share()`](crate::prelude::QueryDsl::for_key_share)
441pub type ForKeyShare<Source> = <Source as LockingDsl<lock::ForKeyShare>>::Output;
442443/// Represents the return type of [`.skip_locked()`](crate::prelude::QueryDsl::skip_locked)
444pub type SkipLocked<Source> = <Source as ModifyLockDsl<lock::SkipLocked>>::Output;
445446/// Represents the return type of [`.no_wait()`](crate::prelude::QueryDsl::no_wait)
447pub type NoWait<Source> = <Source as ModifyLockDsl<lock::NoWait>>::Output;
448449/// Represents the return type of [`.find(pk)`](crate::prelude::QueryDsl::find)
450pub type Find<Source, PK> = <Source as FindDsl<PK>>::Output;
451452/// Represents the return type of [`.or_filter(predicate)`](crate::prelude::QueryDsl::or_filter)
453pub type OrFilter<Source, Predicate> = <Source as OrFilterDsl<Predicate>>::Output;
454455/// Represents the return type of [`.order(ordering)`](crate::prelude::QueryDsl::order)
456pub type Order<Source, Ordering> = <Source as OrderDsl<Ordering>>::Output;
457458/// Represents the return type of [`.order_by(ordering)`](crate::prelude::QueryDsl::order_by)
459 ///
460 /// Type alias of [Order]
461pub type OrderBy<Source, Ordering> = Order<Source, Ordering>;
462463/// Represents the return type of [`.then_order_by(ordering)`](crate::prelude::QueryDsl::then_order_by)
464pub type ThenOrderBy<Source, Ordering> = <Source as ThenOrderDsl<Ordering>>::Output;
465466/// Represents the return type of [`.limit()`](crate::prelude::QueryDsl::limit)
467pub type Limit<Source, DummyArgForAutoType = i64> =
468 <Source as LimitDsl<DummyArgForAutoType>>::Output;
469470/// Represents the return type of [`.offset()`](crate::prelude::QueryDsl::offset)
471pub type Offset<Source, DummyArgForAutoType = i64> =
472 <Source as OffsetDsl<DummyArgForAutoType>>::Output;
473474/// Represents the return type of [`.inner_join(rhs)`](crate::prelude::QueryDsl::inner_join)
475pub type InnerJoin<Source, Rhs> =
476 <Source as JoinWithImplicitOnClause<Rhs, joins::Inner>>::Output;
477478/// Represents the return type of [`.inner_join(rhs.on(on))`](crate::prelude::QueryDsl::inner_join)
479pub type InnerJoinOn<Source, Rhs, On> =
480 <Source as InternalJoinDsl<Rhs, joins::Inner, On>>::Output;
481482/// Represents the return type of [`.left_join(rhs)`](crate::prelude::QueryDsl::left_join)
483pub type LeftJoin<Source, Rhs> =
484 <Source as JoinWithImplicitOnClause<Rhs, joins::LeftOuter>>::Output;
485486/// Represents the return type of [`.left_join(rhs.on(on))`](crate::prelude::QueryDsl::left_join)
487pub type LeftJoinOn<Source, Rhs, On> =
488 <Source as InternalJoinDsl<Rhs, joins::LeftOuter, On>>::Output;
489490/// Represents the return type of [`rhs.on(on)`](crate::query_dsl::JoinOnDsl::on)
491pub type On<Source, On> = joins::OnClauseWrapper<Source, On>;
492493use super::associations::HasTable;
494use super::query_builder::{AsChangeset, IntoUpdateTarget, UpdateStatement};
495496/// Represents the return type of [`update(lhs).set(rhs)`](crate::query_builder::UpdateStatement::set)
497pub type Update<Target, Changes> = UpdateStatement<
498 <Target as HasTable>::Table,
499 <Target as IntoUpdateTarget>::WhereClause,
500 <Changes as AsChangeset>::Changeset,
501 >;
502503/// Represents the return type of [`.into_boxed::<'a, DB>()`](crate::prelude::QueryDsl::into_boxed)
504pub type IntoBoxed<'a, Source, DB> = <Source as BoxedDsl<'a, DB>>::Output;
505506/// Represents the return type of [`.distinct()`](crate::prelude::QueryDsl::distinct)
507pub type Distinct<Source> = <Source as DistinctDsl>::Output;
508509/// Represents the return type of [`.distinct_on(expr)`](crate::prelude::QueryDsl::distinct_on)
510#[cfg(feature = "postgres_backend")]
511pub type DistinctOn<Source, Expr> = <Source as DistinctOnDsl<Expr>>::Output;
512513/// Represents the return type of [`.single_value()`](SingleValueDsl::single_value)
514pub type SingleValue<Source> = <Source as SingleValueDsl>::Output;
515516/// Represents the return type of [`.nullable()`](SelectNullableDsl::nullable)
517pub type NullableSelect<Source> = <Source as SelectNullableDsl>::Output;
518519/// Represents the return type of [`.group_by(expr)`](crate::prelude::QueryDsl::group_by)
520pub type GroupBy<Source, Expr> = <Source as GroupByDsl<Expr>>::Output;
521522/// Represents the return type of [`.having(predicate)`](crate::prelude::QueryDsl::having)
523pub type Having<Source, Predicate> = <Source as HavingDsl<Predicate>>::Output;
524525/// Represents the return type of [`.union(rhs)`](crate::prelude::CombineDsl::union)
526pub type Union<Source, Rhs> = CombinationClause<
527 combination_clause::Union,
528 combination_clause::Distinct,
529 <Source as CombineDsl>::Query,
530 <Rhs as AsQuery>::Query,
531 >;
532533/// Represents the return type of [`.union_all(rhs)`](crate::prelude::CombineDsl::union_all)
534pub type UnionAll<Source, Rhs> = CombinationClause<
535 combination_clause::Union,
536 combination_clause::All,
537 <Source as CombineDsl>::Query,
538 <Rhs as AsQuery>::Query,
539 >;
540541/// Represents the return type of [`.intersect(rhs)`](crate::prelude::CombineDsl::intersect)
542pub type Intersect<Source, Rhs> = CombinationClause<
543 combination_clause::Intersect,
544 combination_clause::Distinct,
545 <Source as CombineDsl>::Query,
546 <Rhs as AsQuery>::Query,
547 >;
548549/// Represents the return type of [`.intersect_all(rhs)`](crate::prelude::CombineDsl::intersect_all)
550pub type IntersectAll<Source, Rhs> = CombinationClause<
551 combination_clause::Intersect,
552 combination_clause::All,
553 <Source as CombineDsl>::Query,
554 <Rhs as AsQuery>::Query,
555 >;
556557/// Represents the return type of [`.except(rhs)`](crate::prelude::CombineDsl::except)
558pub type Except<Source, Rhs> = CombinationClause<
559 combination_clause::Except,
560 combination_clause::Distinct,
561 <Source as CombineDsl>::Query,
562 <Rhs as AsQuery>::Query,
563 >;
564565/// Represents the return type of [`.except_all(rhs)`](crate::prelude::CombineDsl::except_all)
566pub type ExceptAll<Source, Rhs> = CombinationClause<
567 combination_clause::Except,
568 combination_clause::All,
569 <Source as CombineDsl>::Query,
570 <Rhs as AsQuery>::Query,
571 >;
572573type JoinQuerySource<Left, Right, Kind, On> = joins::JoinOn<joins::Join<Left, Right, Kind>, On>;
574575/// A query source representing the inner join between two tables.
576 ///
577 /// The third generic type (`On`) controls how the tables are
578 /// joined.
579 ///
580 /// By default, the implicit join established by [`joinable!`][]
581 /// will be used, allowing you to omit the exact join
582 /// condition. For example, for the inner join between three
583 /// tables that implement [`JoinTo`][], you only need to specify
584 /// the tables: `InnerJoinQuerySource<InnerJoinQuerySource<table1,
585 /// table2>, table3>`.
586 ///
587 /// [`JoinTo`]: crate::query_source::JoinTo
588 ///
589 /// If you use an explicit `ON` clause, you will need to specify
590 /// the `On` generic type.
591 ///
592 /// ```rust
593 /// # include!("doctest_setup.rs");
594 /// use diesel::{dsl, helper_types::InnerJoinQuerySource};
595 /// # use diesel::{backend::Backend, serialize::ToSql, sql_types};
596 /// use schema::*;
597 ///
598 /// # fn main() -> QueryResult<()> {
599 /// # let conn = &mut establish_connection();
600 /// #
601 /// // If you have an explicit join like this...
602 /// let join_constraint = comments::columns::post_id.eq(posts::columns::id);
603 /// # let query =
604 /// posts::table.inner_join(comments::table.on(join_constraint));
605 /// #
606 /// # // Dummy usage just to ensure the example compiles.
607 /// # let filter = posts::columns::id.eq(1);
608 /// # let filter: &FilterExpression<_> = &filter;
609 /// # query.filter(filter).select(posts::columns::id).get_result::<i32>(conn)?;
610 /// #
611 /// # Ok(())
612 /// # }
613 ///
614 /// // ... you can use `InnerJoinQuerySource` like this.
615 /// type JoinConstraint = dsl::Eq<comments::columns::post_id, posts::columns::id>;
616 /// type MyInnerJoinQuerySource = InnerJoinQuerySource<posts::table, comments::table, JoinConstraint>;
617 /// # type FilterExpression<DB> = dyn BoxableExpression<MyInnerJoinQuerySource, DB, SqlType = sql_types::Bool>;
618 /// ```
619pub type InnerJoinQuerySource<Left, Right, On = <Left as joins::JoinTo<Right>>::OnClause> =
620JoinQuerySource<Left, Right, joins::Inner, On>;
621622/// A query source representing the left outer join between two tables.
623 ///
624 /// The third generic type (`On`) controls how the tables are
625 /// joined.
626 ///
627 /// By default, the implicit join established by [`joinable!`][]
628 /// will be used, allowing you to omit the exact join
629 /// condition. For example, for the left join between three
630 /// tables that implement [`JoinTo`][], you only need to specify
631 /// the tables: `LeftJoinQuerySource<LeftJoinQuerySource<table1,
632 /// table2>, table3>`.
633 ///
634 /// [`JoinTo`]: crate::query_source::JoinTo
635 ///
636 /// If you use an explicit `ON` clause, you will need to specify
637 /// the `On` generic type.
638 ///
639 /// ```rust
640 /// # include!("doctest_setup.rs");
641 /// use diesel::{dsl, helper_types::LeftJoinQuerySource};
642 /// # use diesel::{backend::Backend, serialize::ToSql, sql_types};
643 /// use schema::*;
644 ///
645 /// # fn main() -> QueryResult<()> {
646 /// # let conn = &mut establish_connection();
647 /// #
648 /// // If you have an explicit join like this...
649 /// let join_constraint = comments::columns::post_id.eq(posts::columns::id);
650 /// # let query =
651 /// posts::table.left_join(comments::table.on(join_constraint));
652 /// #
653 /// # // Dummy usage just to ensure the example compiles.
654 /// # let filter = posts::columns::id.eq(1);
655 /// # let filter: &FilterExpression<_> = &filter;
656 /// # query.filter(filter).select(posts::columns::id).get_result::<i32>(conn)?;
657 /// #
658 /// # Ok(())
659 /// # }
660 ///
661 /// // ... you can use `LeftJoinQuerySource` like this.
662 /// type JoinConstraint = dsl::Eq<comments::columns::post_id, posts::columns::id>;
663 /// type MyLeftJoinQuerySource = LeftJoinQuerySource<posts::table, comments::table, JoinConstraint>;
664 /// # type FilterExpression<DB> = dyn BoxableExpression<MyLeftJoinQuerySource, DB, SqlType = sql_types::Bool>;
665 /// ```
666pub type LeftJoinQuerySource<Left, Right, On = <Left as joins::JoinTo<Right>>::OnClause> =
667JoinQuerySource<Left, Right, joins::LeftOuter, On>;
668669/// Maps `F` to `Alias<S>`
670 ///
671 /// Any column `F` that belongs to `S::Table` will be transformed into
672 /// [`AliasedField<S, Self>`](crate::query_source::AliasedField)
673 ///
674 /// Any column `F` that does not belong to `S::Table` will be left untouched.
675 ///
676 /// This also works with tuples and some expressions.
677pub type AliasedFields<S, F> = <F as aliasing::FieldAliasMapper<S>>::Out;
678679#[doc(hidden)]
680 #[cfg(all(feature = "with-deprecated", not(feature = "without-deprecated")))]
681 #[deprecated(note = "Use `LoadQuery::RowIter` directly")]
682pub type LoadIter<'conn, 'query, Q, Conn, U, B = crate::connection::DefaultLoadingMode> =
683 <Q as load_dsl::LoadQuery<'query, Conn, U, B>>::RowIter<'conn>;
684685/// Represents the return type of [`diesel::delete`]
686#[allow(non_camel_case_types)] // required for `#[auto_type]`
687pub type delete<T> = crate::query_builder::DeleteStatement<
688 <T as HasTable>::Table,
689 <T as IntoUpdateTarget>::WhereClause,
690 >;
691692/// Represents the return type of [`diesel::insert_into`]
693#[allow(non_camel_case_types)] // required for `#[auto_type]`
694pub type insert_into<T> = crate::query_builder::IncompleteInsertStatement<T>;
695696/// Represents the return type of [`diesel::update`]
697#[allow(non_camel_case_types)] // required for `#[auto_type]`
698pub type update<T> =
699UpdateStatement<<T as HasTable>::Table, <T as IntoUpdateTarget>::WhereClause>;
700701/// Represents the return type of [`diesel::insert_or_ignore_into`]
702#[allow(non_camel_case_types)] // required for `#[auto_type]`
703pub type insert_or_ignore_into<T> = crate::query_builder::IncompleteInsertOrIgnoreStatement<T>;
704705/// Represents the return type of [`diesel::replace_into`]
706#[allow(non_camel_case_types)] // required for `#[auto_type]`
707pub type replace_into<T> = crate::query_builder::IncompleteReplaceStatement<T>;
708709/// Represents the return type of
710 /// [`IncompleteInsertStatement::values()`](crate::query_builder::IncompleteInsertStatement::values)
711pub type Values<I, U> = crate::query_builder::InsertStatement<
712 <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Table,
713 <U as crate::Insertable<
714 <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Table,
715 >>::Values,
716 <I as crate::query_builder::insert_statement::InsertAutoTypeHelper>::Op,
717 >;
718719/// Represents the return type of
720 /// [`UpdateStatement::set()`](crate::query_builder::UpdateStatement::set)
721pub type Set<U, V> = crate::query_builder::UpdateStatement<
722 <U as crate::query_builder::update_statement::UpdateAutoTypeHelper>::Table,
723 <U as crate::query_builder::update_statement::UpdateAutoTypeHelper>::Where,
724 <V as crate::AsChangeset>::Changeset,
725 >;
726727/// Represents the return type of
728 /// [`InsertStatement::returning`](crate::query_builder::InsertStatement::returning),
729 /// [`UpdateStatement::returning`] and
730 /// [`DeleteStatement::returning`](crate::query_builder::DeleteStatement::returning)
731pub type Returning<Q, S> =
732 <Q as crate::query_builder::returning_clause::ReturningClauseHelper<S>>::WithReturning;
733734#[doc(hidden)] // used for `QueryDsl::count`
735pub type Count<Q> = Select<Q, CountStar>;
736}
737738pub mod prelude {
739740//! Re-exports important traits and types. Meant to be glob imported when using Diesel.
741742#[doc(inline)]
743pub use crate::associations::{Associations, GroupedBy, Identifiable};
744#[doc(inline)]
745pub use crate::connection::Connection;
746#[doc(inline)]
747pub use crate::deserialize::{Queryable, QueryableByName};
748#[doc(inline)]
749pub use crate::expression::{
750AppearsOnTable, BoxableExpression, Expression, IntoSql, Selectable, SelectableExpression,
751 };
752// If [`IntoSql`](crate::expression::helper_types::IntoSql) the type gets imported at the
753 // same time as IntoSql the trait (this one) gets imported via the prelude, then
754 // methods of the trait won't be resolved because the type may take priority over the trait.
755 // That issue can be avoided by also importing it anonymously:
756pub use crate::expression::IntoSqlas _;
757758#[doc(inline)]
759pub use crate::expression::functions::declare_sql_function;
760#[doc(inline)]
761pub use crate::expression::functions::define_sql_function;
762#[cfg(all(feature = "with-deprecated", not(feature = "without-deprecated")))]
763pub use crate::expression::functions::sql_function;
764765#[doc(inline)]
766pub use crate::expression::SelectableHelper;
767#[doc(inline)]
768pub use crate::expression_methods::*;
769#[doc(inline)]
770pub use crate::insertable::Insertable;
771#[doc(inline)]
772pub use crate::macros::prelude::*;
773#[doc(inline)]
774pub use crate::query_builder::AsChangeset;
775#[doc(inline)]
776pub use crate::query_builder::DecoratableTarget;
777#[doc(inline)]
778pub use crate::query_builder::has_query::HasQuery;
779#[doc(inline)]
780pub use crate::query_dsl::{
781BelongingToDsl, CombineDsl, JoinOnDsl, QueryDsl, RunQueryDsl, SaveChangesDsl,
782 };
783pub use crate::query_source::SizeRestrictedColumnas _;
784#[doc(inline)]
785pub use crate::query_source::{Column, JoinTo, QuerySource, Table};
786#[doc(inline)]
787pub use crate::result::{
788ConnectionError, ConnectionResult, OptionalEmptyChangesetExtension, OptionalExtension,
789QueryResult,
790 };
791#[doc(inline)]
792pub use diesel_derives::allow_tables_to_appear_in_same_query;
793#[doc(inline)]
794pub use diesel_derives::table_procas table;
795#[doc(inline)]
796pub use diesel_derives::view_procas view;
797798#[cfg(feature = "mysql")]
799 #[doc(inline)]
800pub use crate::mysql::MysqlConnection;
801#[cfg(feature = "postgres")]
802 #[doc(inline)]
803pub use crate::pg::PgConnection;
804#[doc(inline)]
805 #[cfg(feature = "postgres_backend")]
806pub use crate::pg::query_builder::copy::ExecuteCopyFromDsl;
807#[cfg(feature = "__sqlite-shared")]
808 #[doc(inline)]
809pub use crate::sqlite::SqliteConnection;
810}
811812#[doc(inline)]
813pub use crate::macros::table;
814815#[doc(inline)]
816pub use diesel_derives::allow_tables_to_appear_in_same_query;
817818pub use crate::prelude::*;
819#[doc(inline)]
820pub use crate::query_builder::debug_query;
821#[doc(inline)]
822#[cfg(feature = "postgres")]
823pub use crate::query_builder::functions::{copy_from, copy_to};
824#[doc(inline)]
825pub use crate::query_builder::functions::{
826delete, insert_into, insert_or_ignore_into, replace_into, select, sql_query, update,
827};
828pub use crate::result::Error::NotFound;
829830extern crate self as diesel;