Skip to content

Commit 43beff9

Browse files
Shaan Sapradsyer
authored andcommitted
Avoid dropping Postgres schema
The postgres user needs to be an owner of the public schema or a superuser in order to execute the schema.sql for database initialization. To avoid that, two changes are required: - use `CREATE TABLE IF NOT EXISTS` in order to idempotently create the necessary tables - handle conflicts when inserting duplicate data This follows the pattern in use by the src/main/resources/db/mysql/{data,schema.sql} files. Authored-by: Shaan Sapra <shsapra@vmware.com>
1 parent 423a337 commit 43beff9

File tree

2 files changed

+54
-64
lines changed

2 files changed

+54
-64
lines changed
Lines changed: 47 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,53 @@
1-
INSERT INTO vets VALUES (1, 'James', 'Carter');
2-
INSERT INTO vets VALUES (2, 'Helen', 'Leary');
3-
INSERT INTO vets VALUES (3, 'Linda', 'Douglas');
4-
INSERT INTO vets VALUES (4, 'Rafael', 'Ortega');
5-
INSERT INTO vets VALUES (5, 'Henry', 'Stevens');
6-
INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins');
7-
ALTER SEQUENCE vets_id_seq RESTART WITH 7;
1+
INSERT INTO vets VALUES (1, 'James', 'Carter') ON CONFLICT (id) DO NOTHING;
2+
INSERT INTO vets VALUES (2, 'Helen', 'Leary') ON CONFLICT (id) DO NOTHING;
3+
INSERT INTO vets VALUES (3, 'Linda', 'Douglas') ON CONFLICT (id) DO NOTHING;
4+
INSERT INTO vets VALUES (4, 'Rafael', 'Ortega') ON CONFLICT (id) DO NOTHING;
5+
INSERT INTO vets VALUES (5, 'Henry', 'Stevens') ON CONFLICT (id) DO NOTHING;
6+
INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins') ON CONFLICT (id) DO NOTHING;
87

9-
INSERT INTO specialties VALUES (1, 'radiology');
10-
INSERT INTO specialties VALUES (2, 'surgery');
11-
INSERT INTO specialties VALUES (3, 'dentistry');
12-
ALTER SEQUENCE specialties_id_seq RESTART WITH 4;
8+
INSERT INTO specialties VALUES (1, 'radiology') ON CONFLICT (id) DO NOTHING;
9+
INSERT INTO specialties VALUES (2, 'surgery') ON CONFLICT (id) DO NOTHING;
10+
INSERT INTO specialties VALUES (3, 'dentistry') ON CONFLICT (id) DO NOTHING;
1311

14-
INSERT INTO vet_specialties VALUES (2, 1);
15-
INSERT INTO vet_specialties VALUES (3, 2);
16-
INSERT INTO vet_specialties VALUES (3, 3);
17-
INSERT INTO vet_specialties VALUES (4, 2);
18-
INSERT INTO vet_specialties VALUES (5, 1);
12+
INSERT INTO vet_specialties VALUES (2, 1) ON CONFLICT (vet_id, specialty_id) DO NOTHING;
13+
INSERT INTO vet_specialties VALUES (3, 2) ON CONFLICT (vet_id, specialty_id) DO NOTHING;
14+
INSERT INTO vet_specialties VALUES (3, 3) ON CONFLICT (vet_id, specialty_id) DO NOTHING;
15+
INSERT INTO vet_specialties VALUES (4, 2) ON CONFLICT (vet_id, specialty_id) DO NOTHING;
16+
INSERT INTO vet_specialties VALUES (5, 1) ON CONFLICT (vet_id, specialty_id) DO NOTHING;
1917

20-
INSERT INTO types VALUES (1, 'cat');
21-
INSERT INTO types VALUES (2, 'dog');
22-
INSERT INTO types VALUES (3, 'lizard');
23-
INSERT INTO types VALUES (4, 'snake');
24-
INSERT INTO types VALUES (5, 'bird');
25-
INSERT INTO types VALUES (6, 'hamster');
26-
ALTER SEQUENCE types_id_seq RESTART WITH 7;
18+
INSERT INTO types VALUES (1, 'cat') ON CONFLICT (id) DO NOTHING;
19+
INSERT INTO types VALUES (2, 'dog') ON CONFLICT (id) DO NOTHING;
20+
INSERT INTO types VALUES (3, 'lizard') ON CONFLICT (id) DO NOTHING;
21+
INSERT INTO types VALUES (4, 'snake') ON CONFLICT (id) DO NOTHING;
22+
INSERT INTO types VALUES (5, 'bird') ON CONFLICT (id) DO NOTHING;
23+
INSERT INTO types VALUES (6, 'hamster') ON CONFLICT (id) DO NOTHING;
2724

28-
INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023');
29-
INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749');
30-
INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763');
31-
INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198');
32-
INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765');
33-
INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654');
34-
INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387');
35-
INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683');
36-
INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435');
37-
INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487');
38-
ALTER SEQUENCE owners_id_seq RESTART WITH 11;
25+
INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023') ON CONFLICT (id) DO NOTHING;
26+
INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749') ON CONFLICT (id) DO NOTHING;
27+
INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763') ON CONFLICT (id) DO NOTHING;
28+
INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198') ON CONFLICT (id) DO NOTHING;
29+
INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765') ON CONFLICT (id) DO NOTHING;
30+
INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654') ON CONFLICT (id) DO NOTHING;
31+
INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387') ON CONFLICT (id) DO NOTHING;
32+
INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683') ON CONFLICT (id) DO NOTHING;
33+
INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435') ON CONFLICT (id) DO NOTHING;
34+
INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487') ON CONFLICT (id) DO NOTHING;
3935

40-
INSERT INTO pets VALUES (1, 'Leo', '2000-09-07', 1, 1);
41-
INSERT INTO pets VALUES (2, 'Basil', '2002-08-06', 6, 2);
42-
INSERT INTO pets VALUES (3, 'Rosy', '2001-04-17', 2, 3);
43-
INSERT INTO pets VALUES (4, 'Jewel', '2000-03-07', 2, 3);
44-
INSERT INTO pets VALUES (5, 'Iggy', '2000-11-30', 3, 4);
45-
INSERT INTO pets VALUES (6, 'George', '2000-01-20', 4, 5);
46-
INSERT INTO pets VALUES (7, 'Samantha', '1995-09-04', 1, 6);
47-
INSERT INTO pets VALUES (8, 'Max', '1995-09-04', 1, 6);
48-
INSERT INTO pets VALUES (9, 'Lucky', '1999-08-06', 5, 7);
49-
INSERT INTO pets VALUES (10, 'Mulligan', '1997-02-24', 2, 8);
50-
INSERT INTO pets VALUES (11, 'Freddy', '2000-03-09', 5, 9);
51-
INSERT INTO pets VALUES (12, 'Lucky', '2000-06-24', 2, 10);
52-
INSERT INTO pets VALUES (13, 'Sly', '2002-06-08', 1, 10);
53-
ALTER SEQUENCE pets_id_seq RESTART WITH 14;
36+
INSERT INTO pets VALUES (1, 'Leo', '2000-09-07', 1, 1) ON CONFLICT (id) DO NOTHING;
37+
INSERT INTO pets VALUES (2, 'Basil', '2002-08-06', 6, 2) ON CONFLICT (id) DO NOTHING;
38+
INSERT INTO pets VALUES (3, 'Rosy', '2001-04-17', 2, 3) ON CONFLICT (id) DO NOTHING;
39+
INSERT INTO pets VALUES (4, 'Jewel', '2000-03-07', 2, 3) ON CONFLICT (id) DO NOTHING;
40+
INSERT INTO pets VALUES (5, 'Iggy', '2000-11-30', 3, 4) ON CONFLICT (id) DO NOTHING;
41+
INSERT INTO pets VALUES (6, 'George', '2000-01-20', 4, 5) ON CONFLICT (id) DO NOTHING;
42+
INSERT INTO pets VALUES (7, 'Samantha', '1995-09-04', 1, 6) ON CONFLICT (id) DO NOTHING;
43+
INSERT INTO pets VALUES (8, 'Max', '1995-09-04', 1, 6) ON CONFLICT (id) DO NOTHING;
44+
INSERT INTO pets VALUES (9, 'Lucky', '1999-08-06', 5, 7) ON CONFLICT (id) DO NOTHING;
45+
INSERT INTO pets VALUES (10, 'Mulligan', '1997-02-24', 2, 8) ON CONFLICT (id) DO NOTHING;
46+
INSERT INTO pets VALUES (11, 'Freddy', '2000-03-09', 5, 9) ON CONFLICT (id) DO NOTHING;
47+
INSERT INTO pets VALUES (12, 'Lucky', '2000-06-24', 2, 10) ON CONFLICT (id) DO NOTHING;
48+
INSERT INTO pets VALUES (13, 'Sly', '2002-06-08', 1, 10) ON CONFLICT (id) DO NOTHING;
5449

55-
INSERT INTO visits VALUES (1, 7, '2010-03-04', 'rabies shot');
56-
INSERT INTO visits VALUES (2, 8, '2011-03-04', 'rabies shot');
57-
INSERT INTO visits VALUES (3, 8, '2009-06-04', 'neutered');
58-
INSERT INTO visits VALUES (4, 7, '2008-09-04', 'spayed');
59-
ALTER SEQUENCE visits_id_seq RESTART WITH 5;
50+
INSERT INTO visits VALUES (1, 7, '2010-03-04', 'rabies shot') ON CONFLICT (id) DO NOTHING;
51+
INSERT INTO visits VALUES (2, 8, '2011-03-04', 'rabies shot') ON CONFLICT (id) DO NOTHING;
52+
INSERT INTO visits VALUES (3, 8, '2009-06-04', 'neutered') ON CONFLICT (id) DO NOTHING;
53+
INSERT INTO visits VALUES (4, 7, '2008-09-04', 'spayed') ON CONFLICT (id) DO NOTHING;

src/main/resources/db/postgres/schema.sql

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,29 @@
1-
-- Wipe everything before creating the tables to make the script idempotent.
2-
DROP SCHEMA public cascade;
3-
CREATE SCHEMA public;
4-
5-
CREATE TABLE vets (
1+
CREATE TABLE IF NOT EXISTS vets (
62
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
73
first_name TEXT,
84
last_name TEXT
95
);
106
CREATE INDEX ON vets (last_name);
117

12-
CREATE TABLE specialties (
8+
CREATE TABLE IF NOT EXISTS specialties (
139
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
1410
name TEXT
1511
);
1612
CREATE INDEX ON specialties (name);
1713

18-
CREATE TABLE vet_specialties (
14+
CREATE TABLE IF NOT EXISTS vet_specialties (
1915
vet_id INT NOT NULL REFERENCES vets (id),
2016
specialty_id INT NOT NULL REFERENCES specialties (id),
2117
UNIQUE (vet_id, specialty_id)
2218
);
2319

24-
CREATE TABLE types (
20+
CREATE TABLE IF NOT EXISTS types (
2521
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
2622
name TEXT
2723
);
2824
CREATE INDEX ON types (name);
2925

30-
CREATE TABLE owners (
26+
CREATE TABLE IF NOT EXISTS owners (
3127
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
3228
first_name TEXT,
3329
last_name TEXT,
@@ -37,7 +33,7 @@ CREATE TABLE owners (
3733
);
3834
CREATE INDEX ON owners (last_name);
3935

40-
CREATE TABLE pets (
36+
CREATE TABLE IF NOT EXISTS pets (
4137
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
4238
name TEXT,
4339
birth_date DATE,
@@ -47,7 +43,7 @@ CREATE TABLE pets (
4743
CREATE INDEX ON pets (name);
4844
CREATE INDEX ON pets (owner_id);
4945

50-
CREATE TABLE visits (
46+
CREATE TABLE IF NOT EXISTS visits (
5147
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
5248
pet_id INT NOT NULL REFERENCES pets (id),
5349
visit_date DATE,

0 commit comments

Comments
 (0)