Module: Code0::ZeroTrack::Database::MigrationHelpers::TablePartitioning
- Included in:
- Code0::ZeroTrack::Database::Migration::V1_0
- Defined in:
- lib/code0/zero_track/database/migration_helpers/table_partitioning.rb
Instance Method Summary collapse
- #create_dynamic_partition_schema ⇒ Object
- #create_partition_by_date_table(table_name, partition_column:, **options, &block) ⇒ Object
- #create_partitioning_views ⇒ Object
- #drop_dynamic_partition_schema ⇒ Object
- #drop_partitioning_views ⇒ Object
Instance Method Details
#create_dynamic_partition_schema ⇒ Object
28 29 30 31 |
# File 'lib/code0/zero_track/database/migration_helpers/table_partitioning.rb', line 28 def create_dynamic_partition_schema schema = quote_table_name(Rails.application.config.zero_track.db_partitioning.dynamic_partition_schema) execute "CREATE SCHEMA #{schema}" end |
#create_partition_by_date_table(table_name, partition_column:, **options, &block) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/code0/zero_track/database/migration_helpers/table_partitioning.rb', line 8 def create_partition_by_date_table(table_name, partition_column:, **, &block) [:options] = "PARTITION BY RANGE (#{quote_column_name(partition_column)})" [:id] = false create_table(table_name, **) do |t| t.bigserial :id, null: false block.call(t) end reversible do |dir| dir.up do execute <<~SQL.squish ALTER TABLE #{quote_table_name(table_name)} ADD PRIMARY KEY (#{quote_column_name(:id)}, #{quote_column_name(partition_column)}) SQL end end end |
#create_partitioning_views ⇒ Object
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 |
# File 'lib/code0/zero_track/database/migration_helpers/table_partitioning.rb', line 38 def create_partitioning_views dynamic_schema = Rails.application.config.zero_track.db_partitioning.dynamic_partition_schema execute <<-SQL.squish CREATE OR REPLACE VIEW postgres_partitioned_tables AS SELECT c.oid::regclass::text AS identifier, c.oid, n.nspname AS schema, c.relname AS name, CASE p.partstrat WHEN 'l' THEN 'list' WHEN 'r' THEN 'range' WHEN 'h' THEN 'hash' END AS strategy, pg_get_partkeydef(c.oid) AS partition_key FROM pg_partitioned_table p JOIN pg_class c ON c.oid = p.partrelid JOIN pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = current_schema(); SQL execute <<-SQL.squish CREATE OR REPLACE VIEW postgres_partitions AS SELECT c.oid::regclass::text AS identifier, c.oid, n.nspname AS schema, c.relname AS name, i.inhparent::regclass::text AS parent_identifier, pg_get_expr(c.relpartbound, c.oid) AS condition, obj_description(c.oid) AS comment, i.inhrelid IS NOT NULL AS attached FROM pg_class c LEFT JOIN pg_inherits i ON c.oid = i.inhrelid JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relispartition AND c.relkind = 'r' AND n.nspname IN (current_schema(), #{quote(dynamic_schema)}); SQL execute <<-SQL.squish CREATE OR REPLACE VIEW postgres_detached_partitions AS SELECT c.oid::regclass::text AS identifier, c.oid, n.nspname AS schema, c.relname AS name, obj_description(c.oid)::jsonb ->> 'table' AS parent_identifier, (obj_description(c.oid)::jsonb ->> 'detached_at')::timestamptz AS detached_at FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind = 'r' AND n.nspname = #{quote(dynamic_schema)} AND NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inhrelid = c.oid ) AND obj_description(c.oid)::jsonb ? 'table' AND obj_description(c.oid)::jsonb ? 'detached_at'; SQL end |
#drop_dynamic_partition_schema ⇒ Object
33 34 35 36 |
# File 'lib/code0/zero_track/database/migration_helpers/table_partitioning.rb', line 33 def drop_dynamic_partition_schema schema = quote_table_name(Rails.application.config.zero_track.db_partitioning.dynamic_partition_schema) execute "DROP SCHEMA #{schema}" end |
#drop_partitioning_views ⇒ Object
97 98 99 100 101 |
# File 'lib/code0/zero_track/database/migration_helpers/table_partitioning.rb', line 97 def drop_partitioning_views execute 'DROP VIEW IF EXISTS postgres_detached_partitions' execute 'DROP VIEW IF EXISTS postgres_partitions' execute 'DROP VIEW IF EXISTS postgres_partitioned_tables' end |