Skip to content

Commit acee735

Browse files
committed
#277: Adding '+refinery NO TRANSACTION' directive
1 parent 3fa178f commit acee735

File tree

24 files changed

+561
-141
lines changed

24 files changed

+561
-141
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ This would stop developer 1's migration from ever running if you were using cont
9696

9797
refinery works by creating a table that keeps all the applied migrations' versions and their metadata. When you [run](https://docs.rs/refinery/latest/refinery/struct.Runner.html#method.run) the migrations `Runner`, refinery compares the applied migrations with the ones to be applied, checking for [divergent](https://docs.rs/refinery/latest/refinery/struct.Runner.html#method.set_abort_divergent) and [missing](https://docs.rs/refinery/latest/refinery/struct.Runner.html#method.set_abort_missing) and executing unapplied migrations.\
9898
By default, refinery runs each migration in a single transaction. Alternatively, you can also configure refinery to wrap the entire execution of all migrations in a single transaction by setting [set_grouped](https://docs.rs/refinery/latest/refinery/struct.Runner.html#method.set_grouped) to true.
99+
Directive `-- +refinery NO TRANSACTION` can be used to escape running a migration within a transaction. [!IMPORTANT]: `set_grouped` takes precedence over no transaction directive.
99100
The rust crate intentionally ignores new migration files until your sourcecode is rebuild. This prevents accidental migrations and altering the database schema without any code changes. We can also bake the migrations into the binary, so no additional files are needed when deployed.
100101

101102
### Rollback
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-- +refinery NO TRANSACTION
2+
BEGIN;
3+
INSERT INTO cars(id, name, brand) VALUES (2, "muscle", "toyota");
4+
COMMIT;

refinery/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ for more examples refer to the [examples](https://github.com/rust-db/refinery/tr
3232
*/
3333

3434
pub use refinery_core::config;
35-
pub use refinery_core::{error, load_sql_migrations, Error, Migration, Report, Runner, Target};
35+
pub use refinery_core::{
36+
error, load_sql_migrations, Error, Migration, MigrationFlags, Report, Runner, Target,
37+
};
3638
#[doc(hidden)]
3739
pub use refinery_core::{AsyncMigrate, Migrate};
3840
pub use refinery_macros::embed_migrations;

refinery/tests/mysql.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,30 +35,38 @@ mod mysql {
3535
fn get_migrations() -> Vec<Migration> {
3636
embed_migrations!("./tests/migrations");
3737

38-
let migration1 =
39-
Migration::unapplied("V1__initial.rs", &migrations::V1__initial::migration()).unwrap();
38+
let migration1 = Migration::unapplied(
39+
"V1__initial.rs",
40+
&migrations::V1__initial::migration(),
41+
Default::default(),
42+
)
43+
.unwrap();
4044

4145
let migration2 = Migration::unapplied(
4246
"V2__add_cars_and_motos_table.sql",
4347
include_str!("./migrations/V1-2/V2__add_cars_and_motos_table.sql"),
48+
Default::default(),
4449
)
4550
.unwrap();
4651

4752
let migration3 = Migration::unapplied(
4853
"V3__add_brand_to_cars_table",
4954
include_str!("./migrations/V3/V3__add_brand_to_cars_table.sql"),
55+
Default::default(),
5056
)
5157
.unwrap();
5258

5359
let migration4 = Migration::unapplied(
5460
"V4__add_year_to_motos_table.rs",
5561
&migrations::V4__add_year_to_motos_table::migration(),
62+
Default::default(),
5663
)
5764
.unwrap();
5865

5966
let migration5 = Migration::unapplied(
6067
"V5__add_year_field_to_cars",
6168
"ALTER TABLE cars ADD year INTEGER;",
69+
Default::default(),
6270
)
6371
.unwrap();
6472

@@ -473,6 +481,7 @@ mod mysql {
473481
let migration = Migration::unapplied(
474482
"V4__add_year_field_to_cars",
475483
"ALTER TABLE cars ADD year INTEGER;",
484+
Default::default(),
476485
)
477486
.unwrap();
478487
let err = conn
@@ -509,6 +518,7 @@ mod mysql {
509518
let migration = Migration::unapplied(
510519
"V2__add_year_field_to_cars",
511520
"ALTER TABLE cars ADD year INTEGER;",
521+
Default::default(),
512522
)
513523
.unwrap();
514524
let err = conn
@@ -552,12 +562,14 @@ mod mysql {
552562
"city varchar(255)",
553563
");"
554564
),
565+
Default::default(),
555566
)
556567
.unwrap();
557568

558569
let migration2 = Migration::unapplied(
559570
"V2__add_cars_table",
560571
include_str!("./migrations_missing/V2__add_cars_table.sql"),
572+
Default::default(),
561573
)
562574
.unwrap();
563575
let err = conn

refinery/tests/mysql_async.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,30 +19,38 @@ mod mysql_async {
1919
fn get_migrations() -> Vec<Migration> {
2020
embed_migrations!("./tests/migrations");
2121

22-
let migration1 =
23-
Migration::unapplied("V1__initial.rs", &migrations::V1__initial::migration()).unwrap();
22+
let migration1 = Migration::unapplied(
23+
"V1__initial.rs",
24+
&migrations::V1__initial::migration(),
25+
Default::default(),
26+
)
27+
.unwrap();
2428

2529
let migration2 = Migration::unapplied(
2630
"V2__add_cars_and_motos_table.sql",
2731
include_str!("./migrations/V1-2/V2__add_cars_and_motos_table.sql"),
32+
Default::default(),
2833
)
2934
.unwrap();
3035

3136
let migration3 = Migration::unapplied(
3237
"V3__add_brand_to_cars_table",
3338
include_str!("./migrations/V3/V3__add_brand_to_cars_table.sql"),
39+
Default::default(),
3440
)
3541
.unwrap();
3642

3743
let migration4 = Migration::unapplied(
3844
"V4__add_year_to_motos_table.rs",
3945
&migrations::V4__add_year_to_motos_table::migration(),
46+
Default::default(),
4047
)
4148
.unwrap();
4249

4350
let migration5 = Migration::unapplied(
4451
"V5__add_year_field_to_cars",
4552
"ALTER TABLE cars ADD year INTEGER;",
53+
Default::default(),
4654
)
4755
.unwrap();
4856

@@ -483,6 +491,7 @@ mod mysql_async {
483491
let migration = Migration::unapplied(
484492
"V4__add_year_field_to_cars",
485493
"ALTER TABLE cars ADD year INTEGER;",
494+
Default::default(),
486495
)
487496
.unwrap();
488497

@@ -528,6 +537,7 @@ mod mysql_async {
528537
let migration = Migration::unapplied(
529538
"V2__add_year_field_to_cars",
530539
"ALTER TABLE cars ADD year INTEGER;",
540+
Default::default(),
531541
)
532542
.unwrap();
533543

@@ -575,12 +585,14 @@ mod mysql_async {
575585
"city varchar(255)",
576586
");"
577587
),
588+
Default::default(),
578589
)
579590
.unwrap();
580591

581592
let migration2 = Migration::unapplied(
582593
"V2__add_cars_table",
583594
include_str!("./migrations_missing/V2__add_cars_table.sql"),
595+
Default::default(),
584596
)
585597
.unwrap();
586598
let err = pool

refinery/tests/postgres.rs

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ mod postgres {
55
use assert_cmd::prelude::*;
66
use predicates::str::contains;
77
use refinery::{
8-
config::Config, embed_migrations, error::Kind, Migrate, Migration, Runner, Target,
8+
config::Config, embed_migrations, error::Kind, Migrate, Migration, MigrationFlags, Runner,
9+
Target,
910
};
1011
use refinery_core::postgres::{Client, NoTls};
1112
use std::process::Command;
@@ -36,34 +37,53 @@ mod postgres {
3637
fn get_migrations() -> Vec<Migration> {
3738
embed_migrations!("./tests/migrations");
3839

39-
let migration1 =
40-
Migration::unapplied("V1__initial.rs", &migrations::V1__initial::migration()).unwrap();
40+
let migration1 = Migration::unapplied(
41+
"V1__initial.rs",
42+
&migrations::V1__initial::migration(),
43+
Default::default(),
44+
)
45+
.unwrap();
4146

4247
let migration2 = Migration::unapplied(
4348
"V2__add_cars_and_motos_table.sql",
4449
include_str!("./migrations/V1-2/V2__add_cars_and_motos_table.sql"),
50+
Default::default(),
4551
)
4652
.unwrap();
4753

4854
let migration3 = Migration::unapplied(
4955
"V3__add_brand_to_cars_table",
5056
include_str!("./migrations/V3/V3__add_brand_to_cars_table.sql"),
57+
Default::default(),
5158
)
5259
.unwrap();
5360

5461
let migration4 = Migration::unapplied(
5562
"V4__add_year_to_motos_table.rs",
5663
&migrations::V4__add_year_to_motos_table::migration(),
64+
Default::default(),
5765
)
5866
.unwrap();
5967

6068
let migration5 = Migration::unapplied(
6169
"V5__add_year_field_to_cars",
6270
"ALTER TABLE cars ADD year INTEGER;",
71+
Default::default(),
72+
)
73+
.unwrap();
74+
75+
let migration6 = Migration::unapplied(
76+
"V6__index_motos_table_concurrently",
77+
"CREATE INDEX CONCURRENTLY motos_name ON motos(name);",
78+
MigrationFlags {
79+
run_in_transaction: false,
80+
},
6381
)
6482
.unwrap();
6583

66-
vec![migration1, migration2, migration3, migration4, migration5]
84+
vec![
85+
migration1, migration2, migration3, migration4, migration5, migration6,
86+
]
6787
}
6888

6989
fn prep_database() {
@@ -342,7 +362,7 @@ mod postgres {
342362

343363
let migrations = get_migrations();
344364

345-
let mchecksum = migrations[4].checksum();
365+
let mchecksum = migrations[5].checksum();
346366
client
347367
.migrate(
348368
&migrations,
@@ -359,7 +379,7 @@ mod postgres {
359379
.unwrap()
360380
.unwrap();
361381

362-
assert_eq!(5, current.version());
382+
assert_eq!(6, current.version());
363383
assert_eq!(mchecksum, current.checksum());
364384
});
365385
}
@@ -445,6 +465,7 @@ mod postgres {
445465
let migration = Migration::unapplied(
446466
"V4__add_year_field_to_cars",
447467
"ALTER TABLE cars ADD year INTEGER;",
468+
Default::default(),
448469
)
449470
.unwrap();
450471
let err = client
@@ -478,6 +499,7 @@ mod postgres {
478499
let migration = Migration::unapplied(
479500
"V2__add_year_field_to_cars",
480501
"ALTER TABLE cars ADD year INTEGER;",
502+
Default::default(),
481503
)
482504
.unwrap();
483505
let err = client
@@ -518,12 +540,14 @@ mod postgres {
518540
"city varchar(255)",
519541
");"
520542
),
543+
Default::default(),
521544
)
522545
.unwrap();
523546

524547
let migration2 = Migration::unapplied(
525548
"V2__add_cars_table",
526549
include_str!("./migrations_missing/V2__add_cars_table.sql"),
550+
Default::default(),
527551
)
528552
.unwrap();
529553
let err = client
@@ -560,25 +584,28 @@ mod postgres {
560584
runner.run(&mut config).unwrap();
561585

562586
let applied_migrations = runner.get_applied_migrations(&mut config).unwrap();
563-
assert_eq!(5, applied_migrations.len());
587+
assert_eq!(6, applied_migrations.len());
564588

565589
assert_eq!(migrations[0].version(), applied_migrations[0].version());
566590
assert_eq!(migrations[1].version(), applied_migrations[1].version());
567591
assert_eq!(migrations[2].version(), applied_migrations[2].version());
568592
assert_eq!(migrations[3].version(), applied_migrations[3].version());
569593
assert_eq!(migrations[4].version(), applied_migrations[4].version());
594+
assert_eq!(migrations[5].version(), applied_migrations[5].version());
570595

571596
assert_eq!(migrations[0].name(), migrations[0].name());
572597
assert_eq!(migrations[1].name(), applied_migrations[1].name());
573598
assert_eq!(migrations[2].name(), applied_migrations[2].name());
574599
assert_eq!(migrations[3].name(), applied_migrations[3].name());
575600
assert_eq!(migrations[4].name(), applied_migrations[4].name());
601+
assert_eq!(migrations[5].name(), applied_migrations[5].name());
576602

577603
assert_eq!(migrations[0].checksum(), applied_migrations[0].checksum());
578604
assert_eq!(migrations[1].checksum(), applied_migrations[1].checksum());
579605
assert_eq!(migrations[2].checksum(), applied_migrations[2].checksum());
580606
assert_eq!(migrations[3].checksum(), applied_migrations[3].checksum());
581607
assert_eq!(migrations[4].checksum(), applied_migrations[4].checksum());
608+
assert_eq!(migrations[5].checksum(), applied_migrations[5].checksum());
582609
})
583610
}
584611

@@ -596,25 +623,28 @@ mod postgres {
596623
let report = runner.run(&mut config).unwrap();
597624

598625
let applied_migrations = report.applied_migrations();
599-
assert_eq!(5, applied_migrations.len());
626+
assert_eq!(6, applied_migrations.len());
600627

601628
assert_eq!(migrations[0].version(), applied_migrations[0].version());
602629
assert_eq!(migrations[1].version(), applied_migrations[1].version());
603630
assert_eq!(migrations[2].version(), applied_migrations[2].version());
604631
assert_eq!(migrations[3].version(), applied_migrations[3].version());
605632
assert_eq!(migrations[4].version(), applied_migrations[4].version());
633+
assert_eq!(migrations[5].version(), applied_migrations[5].version());
606634

607635
assert_eq!(migrations[0].name(), migrations[0].name());
608636
assert_eq!(migrations[1].name(), applied_migrations[1].name());
609637
assert_eq!(migrations[2].name(), applied_migrations[2].name());
610638
assert_eq!(migrations[3].name(), applied_migrations[3].name());
611639
assert_eq!(migrations[4].name(), applied_migrations[4].name());
640+
assert_eq!(migrations[5].name(), applied_migrations[5].name());
612641

613642
assert_eq!(migrations[0].checksum(), applied_migrations[0].checksum());
614643
assert_eq!(migrations[1].checksum(), applied_migrations[1].checksum());
615644
assert_eq!(migrations[2].checksum(), applied_migrations[2].checksum());
616645
assert_eq!(migrations[3].checksum(), applied_migrations[3].checksum());
617646
assert_eq!(migrations[4].checksum(), applied_migrations[4].checksum());
647+
assert_eq!(migrations[5].checksum(), applied_migrations[5].checksum());
618648
})
619649
}
620650

@@ -635,11 +665,11 @@ mod postgres {
635665
.get_last_applied_migration(&mut config)
636666
.unwrap()
637667
.unwrap();
638-
assert_eq!(5, applied_migration.version());
668+
assert_eq!(6, applied_migration.version());
639669

640-
assert_eq!(migrations[4].version(), applied_migration.version());
641-
assert_eq!(migrations[4].name(), applied_migration.name());
642-
assert_eq!(migrations[4].checksum(), applied_migration.checksum());
670+
assert_eq!(migrations[5].version(), applied_migration.version());
671+
assert_eq!(migrations[5].name(), applied_migration.name());
672+
assert_eq!(migrations[5].checksum(), applied_migration.checksum());
643673
})
644674
}
645675

0 commit comments

Comments
 (0)