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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
// Built-in Lints #![deny(warnings, missing_copy_implementations)] // Clippy lints #![allow( clippy::needless_pass_by_value, clippy::option_map_unwrap_or_else, clippy::option_map_unwrap_or )] #![warn( clippy::wrong_pub_self_convention, clippy::mut_mut, clippy::non_ascii_literal, clippy::similar_names, clippy::unicode_not_nfc, clippy::if_not_else, clippy::items_after_statements, clippy::used_underscore_binding )] //! Provides functions for maintaining database schema. //! //! A database migration always provides procedures to update the schema, as well as to revert //! itself. Diesel's migrations are versioned, and run in order. Diesel also takes care of tracking //! which migrations have already been run automatically. Your migrations don't need to be //! idempotent, as Diesel will ensure no migration is run twice unless it has been reverted. //! //! Migrations should be placed in a `/migrations` directory at the root of your project (the same //! directory as `Cargo.toml`). When any of these functions are run, Diesel will search for the //! migrations directory in the current directory and its parents, stopping when it finds the //! directory containing `Cargo.toml`. //! //! Individual migrations should be a folder containing exactly two files, `up.sql` and `down.sql`. //! `up.sql` will be used to run the migration, while `down.sql` will be used for reverting it. The //! folder itself should have the structure `{version}_{migration_name}`. It is recommended that //! you use the timestamp of creation for the version. //! //! Migrations can either be run with the CLI or embedded into the compiled application //! and executed with code, for example right after establishing a database connection. //! For more information, consult the [`embed_migrations!`](macro.embed_migrations.html) macro. //! //! ## Example //! //! ```text //! # Directory Structure //! - 20151219180527_create_users //! - up.sql //! - down.sql //! - 20160107082941_create_posts //! - up.sql //! - down.sql //! ``` //! //! ```sql //! -- 20151219180527_create_users/up.sql //! CREATE TABLE users ( //! id SERIAL PRIMARY KEY, //! name VARCHAR NOT NULL, //! hair_color VARCHAR //! ); //! ``` //! //! ```sql //! -- 20151219180527_create_users/down.sql //! DROP TABLE users; //! ``` //! //! ```sql //! -- 20160107082941_create_posts/up.sql //! CREATE TABLE posts ( //! id SERIAL PRIMARY KEY, //! user_id INTEGER NOT NULL, //! title VARCHAR NOT NULL, //! body TEXT //! ); //! ``` //! //! ```sql //! -- 20160107082941_create_posts/down.sql //! DROP TABLE posts; //! ``` extern crate migrations_internals; extern crate migrations_macros; #[doc(inline)] pub use migrations_internals::any_pending_migrations; #[doc(inline)] pub use migrations_internals::find_migrations_directory; #[doc(inline)] pub use migrations_internals::mark_migrations_in_directory; #[doc(inline)] pub use migrations_internals::migration_from; #[doc(inline)] pub use migrations_internals::migration_paths_in_directory; #[doc(inline)] pub use migrations_internals::name; #[doc(inline)] pub use migrations_internals::revert_latest_migration; #[doc(inline)] pub use migrations_internals::revert_latest_migration_in_directory; #[doc(inline)] pub use migrations_internals::revert_migration_with_version; #[doc(inline)] pub use migrations_internals::run_migration_with_version; #[doc(inline)] pub use migrations_internals::run_migrations; #[doc(inline)] pub use migrations_internals::run_pending_migrations; #[doc(inline)] pub use migrations_internals::run_pending_migrations_in_directory; #[doc(inline)] pub use migrations_internals::search_for_migrations_directory; #[doc(inline)] pub use migrations_internals::setup_database; #[doc(inline)] pub use migrations_internals::version_from_path; #[doc(inline)] pub use migrations_internals::Migration; #[doc(inline)] pub use migrations_internals::MigrationConnection; #[doc(inline)] pub use migrations_internals::MigrationError; #[doc(inline)] pub use migrations_internals::MigrationName; #[doc(inline)] pub use migrations_internals::RunMigrationsError; #[doc(hidden)] pub use migrations_macros::*; pub mod connection { #[doc(inline)] pub use migrations_internals::connection::MigrationConnection; } #[macro_export] /// This macro will read your migrations at compile time, and embed a module you can use to execute /// them at runtime without the migration files being present on the file system. This is useful if /// you would like to use Diesel's migration infrastructure, but want to ship a single executable /// file (such as for embedded applications). It can also be used to apply migrations to an in /// memory database (Diesel does this for its own test suite). /// /// You can optionally pass the path to the migrations directory to this macro. When left /// unspecified, Diesel Codegen will search for the migrations directory in the same way that /// Diesel CLI does. If specified, the path should be relative to the directory where `Cargo.toml` /// resides. /// /// # Examples /// /// ```rust /// # #[macro_use] extern crate diesel; /// # #[macro_use] extern crate diesel_migrations; /// # include!("../../diesel/src/doctest_setup.rs"); /// # table! { /// # users { /// # id -> Integer, /// # name -> VarChar, /// # } /// # } /// # /// # #[cfg(feature = "postgres")] /// # embed_migrations!("../migrations/postgresql"); /// # #[cfg(all(feature = "mysql", not(feature = "postgres")))] /// # embed_migrations!("../migrations/mysql"); /// # #[cfg(all(feature = "sqlite", not(any(feature = "postgres", feature = "mysql"))))] /// embed_migrations!("../migrations/sqlite"); /// /// fn main() { /// let connection = establish_connection(); /// /// // This will run the necessary migrations. /// embedded_migrations::run(&connection); /// /// // By default the output is thrown out. If you want to redirect it to stdout, you /// // should call embedded_migrations::run_with_output. /// embedded_migrations::run_with_output(&connection, &mut std::io::stdout()); /// } /// ``` macro_rules! embed_migrations { () => { #[allow(dead_code)] mod embedded_migrations { #[derive(EmbedMigrations)] struct _Dummy; } }; ($migrations_path:expr) => { #[allow(dead_code)] mod embedded_migrations { #[derive(EmbedMigrations)] #[embed_migrations_options(migrations_path=$migrations_path)] struct _Dummy; } }; }