pgslice 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -1
- data/README.md +60 -0
- data/lib/pgslice.rb +25 -28
- data/lib/pgslice/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 595fd1ef4439e8f5180ee6f84596c088124cf900
|
4
|
+
data.tar.gz: 6a7144e70f93c4edeb7b48be0efe28e6ccfd87f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ffb023c7ceacab8f0362808131a6a8d680455d756ab636f558257390c68b20214edf2ad4eefb3dd6f5fb46b9a9b7a8eb264fa070ffc4fca34e051c9b069ca66f
|
7
|
+
data.tar.gz: 44869b8f950334d8db95a9a081937966367e1cac30caa5ce03254b694f54f893f04a429f935e2f6a80487465c5283005f280512ac3b600f027a2f9fd87d4ec16
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -84,6 +84,66 @@ To undo swap, use:
|
|
84
84
|
pgslice unswap <table>
|
85
85
|
```
|
86
86
|
|
87
|
+
## Sample Output
|
88
|
+
|
89
|
+
`pgslice` prints the SQL commands that were executed on the server. To print without executing, use the `--dry-run` option.
|
90
|
+
|
91
|
+
```console
|
92
|
+
$ pgslice prep locations created_at day
|
93
|
+
BEGIN;
|
94
|
+
|
95
|
+
CREATE TABLE locations_intermediate (
|
96
|
+
LIKE locations INCLUDING INDEXES INCLUDING DEFAULTS
|
97
|
+
);
|
98
|
+
|
99
|
+
CREATE FUNCTION locations_insert_trigger()
|
100
|
+
RETURNS trigger AS $$
|
101
|
+
BEGIN
|
102
|
+
EXECUTE 'INSERT INTO public.locations_' || to_char(NEW.created_at, 'YYYYMMDD') || ' VALUES ($1.*)' USING NEW;
|
103
|
+
RETURN NULL;
|
104
|
+
END;
|
105
|
+
$$ LANGUAGE plpgsql;
|
106
|
+
|
107
|
+
CREATE TRIGGER locations_insert_trigger
|
108
|
+
BEFORE INSERT ON locations_intermediate
|
109
|
+
FOR EACH ROW EXECUTE PROCEDURE locations_insert_trigger();
|
110
|
+
|
111
|
+
COMMIT;
|
112
|
+
```
|
113
|
+
|
114
|
+
```console
|
115
|
+
$ pgslice add_partitions locations --intermediate --past 1 --future 1
|
116
|
+
BEGIN;
|
117
|
+
|
118
|
+
CREATE TABLE locations_20160423 (
|
119
|
+
LIKE locations_intermediate INCLUDING INDEXES INCLUDING DEFAULTS,
|
120
|
+
CHECK (created_at >= '2016-04-23'::date AND created_at < '2016-04-24'::date)
|
121
|
+
) INHERITS (locations_intermediate);
|
122
|
+
|
123
|
+
CREATE TABLE locations_20160424 (
|
124
|
+
LIKE locations_intermediate INCLUDING INDEXES INCLUDING DEFAULTS,
|
125
|
+
CHECK (created_at >= '2016-04-24'::date AND created_at < '2016-04-25'::date)
|
126
|
+
) INHERITS (locations_intermediate);
|
127
|
+
|
128
|
+
CREATE TABLE locations_20160425 (
|
129
|
+
LIKE locations_intermediate INCLUDING INDEXES INCLUDING DEFAULTS,
|
130
|
+
CHECK (created_at >= '2016-04-25'::date AND created_at < '2016-04-26'::date)
|
131
|
+
) INHERITS (locations_intermediate);
|
132
|
+
|
133
|
+
COMMIT;
|
134
|
+
```
|
135
|
+
|
136
|
+
```console
|
137
|
+
$ pgslice swap locations
|
138
|
+
BEGIN;
|
139
|
+
|
140
|
+
ALTER TABLE locations RENAME TO locations_retired;
|
141
|
+
|
142
|
+
ALTER TABLE locations_intermediate RENAME TO locations;
|
143
|
+
|
144
|
+
COMMIT;
|
145
|
+
```
|
146
|
+
|
87
147
|
## Upgrading
|
88
148
|
|
89
149
|
Run:
|
data/lib/pgslice.rb
CHANGED
@@ -59,8 +59,6 @@ module PgSlice
|
|
59
59
|
abort "Column not found: #{column}" unless columns(table).include?(column)
|
60
60
|
abort "Invalid period: #{period}" unless SQL_FORMAT[period.to_sym]
|
61
61
|
|
62
|
-
log "Creating #{intermediate_table} from #{table}"
|
63
|
-
|
64
62
|
queries = []
|
65
63
|
|
66
64
|
queries << <<-SQL
|
@@ -97,8 +95,6 @@ FOR EACH ROW EXECUTE PROCEDURE #{trigger_name}();
|
|
97
95
|
abort "Usage: pgslice unprep <table>" if arguments.length != 1
|
98
96
|
abort "Table not found: #{intermediate_table}" unless table_exists?(intermediate_table)
|
99
97
|
|
100
|
-
log "Dropping #{intermediate_table}"
|
101
|
-
|
102
98
|
queries = [
|
103
99
|
"DROP TABLE #{intermediate_table} CASCADE;",
|
104
100
|
"DROP FUNCTION #{trigger_name}();"
|
@@ -130,7 +126,6 @@ FOR EACH ROW EXECUTE PROCEDURE #{trigger_name}();
|
|
130
126
|
partition_name = "#{original_table}_#{day.strftime(name_format)}"
|
131
127
|
next if table_exists?(partition_name)
|
132
128
|
|
133
|
-
log "Creating #{partition_name} from #{table}"
|
134
129
|
date_format = "%Y-%m-%d"
|
135
130
|
|
136
131
|
queries << <<-SQL
|
@@ -175,22 +170,24 @@ CREATE TABLE #{partition_name} (
|
|
175
170
|
fields = columns(source_table).join(", ")
|
176
171
|
batch_size = options[:batch_size]
|
177
172
|
|
178
|
-
|
179
|
-
|
180
|
-
|
173
|
+
log "Overview"
|
174
|
+
log "#{source_table} max #{primary_key}: #{max_source_id}"
|
175
|
+
log "#{dest_table} max #{primary_key}: #{max_dest_id}"
|
176
|
+
log "time period: #{starting_time.to_date} -> #{ending_time.to_date}"
|
177
|
+
log
|
181
178
|
|
182
|
-
|
183
|
-
|
179
|
+
log "Batches"
|
180
|
+
while starting_id <= max_source_id
|
181
|
+
log "#{starting_id}..#{[starting_id + batch_size - 1, max_source_id].min}"
|
184
182
|
|
185
|
-
|
186
|
-
|
187
|
-
|
183
|
+
query = "INSERT INTO #{dest_table} (#{fields}) SELECT #{fields} FROM #{source_table} WHERE #{primary_key} >= #{starting_id} AND #{primary_key} < #{starting_id + batch_size} AND #{field} >= '#{starting_time.strftime(date_format)}'::date AND #{field} < '#{ending_time.strftime(date_format)}'::date"
|
184
|
+
log query if options[:debug]
|
185
|
+
execute(query)
|
188
186
|
|
189
|
-
|
187
|
+
starting_id += batch_size
|
190
188
|
|
191
|
-
|
192
|
-
|
193
|
-
end
|
189
|
+
if options[:sleep] && starting_id <= max_source_id
|
190
|
+
sleep(options[:sleep])
|
194
191
|
end
|
195
192
|
end
|
196
193
|
end
|
@@ -205,9 +202,6 @@ CREATE TABLE #{partition_name} (
|
|
205
202
|
abort "Table not found: #{intermediate_table}" unless table_exists?(intermediate_table)
|
206
203
|
abort "Table already exists: #{retired_table}" if table_exists?(retired_table)
|
207
204
|
|
208
|
-
log "Renaming #{table} to #{retired_table}"
|
209
|
-
log "Renaming #{intermediate_table} to #{table}"
|
210
|
-
|
211
205
|
queries = [
|
212
206
|
"ALTER TABLE #{table} RENAME TO #{retired_table};",
|
213
207
|
"ALTER TABLE #{intermediate_table} RENAME TO #{table};"
|
@@ -225,9 +219,6 @@ CREATE TABLE #{partition_name} (
|
|
225
219
|
abort "Table not found: #{retired_table}" unless table_exists?(retired_table)
|
226
220
|
abort "Table already exists: #{intermediate_table}" if table_exists?(intermediate_table)
|
227
221
|
|
228
|
-
log "Renaming #{table} to #{intermediate_table}"
|
229
|
-
log "Renaming #{retired_table} to #{table}"
|
230
|
-
|
231
222
|
queries = [
|
232
223
|
"ALTER TABLE #{table} RENAME TO #{intermediate_table};",
|
233
224
|
"ALTER TABLE #{retired_table} RENAME TO #{table};"
|
@@ -246,6 +237,7 @@ CREATE TABLE #{partition_name} (
|
|
246
237
|
o.integer "--future", default: 3
|
247
238
|
o.integer "--past", default: 3
|
248
239
|
o.integer "--batch-size", default: 10000
|
240
|
+
o.boolean "--dry-run", default: false
|
249
241
|
o.on "-v", "--version", "print the version" do
|
250
242
|
log PgSlice::VERSION
|
251
243
|
@exit = true
|
@@ -263,6 +255,10 @@ CREATE TABLE #{partition_name} (
|
|
263
255
|
$stderr.puts message
|
264
256
|
end
|
265
257
|
|
258
|
+
def log_sql(message = nil)
|
259
|
+
$stdout.puts message
|
260
|
+
end
|
261
|
+
|
266
262
|
def abort(message)
|
267
263
|
raise PgSlice::Error, message
|
268
264
|
end
|
@@ -294,13 +290,14 @@ CREATE TABLE #{partition_name} (
|
|
294
290
|
def run_queries(queries)
|
295
291
|
connection.transaction do
|
296
292
|
execute("SET client_min_messages TO warning")
|
297
|
-
|
298
|
-
|
293
|
+
log_sql "BEGIN;"
|
294
|
+
log_sql
|
299
295
|
queries.each do |query|
|
300
|
-
|
301
|
-
|
302
|
-
execute(query)
|
296
|
+
log_sql query
|
297
|
+
log_sql
|
298
|
+
execute(query) unless options[:dry_run]
|
303
299
|
end
|
300
|
+
log_sql "COMMIT;"
|
304
301
|
end
|
305
302
|
end
|
306
303
|
|
data/lib/pgslice/version.rb
CHANGED