pgslice 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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