0.0
No release in over 3 years
Low commit activity in last 3 years
PostgreSQL partitioning assistant for Rails
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

>= 0
 Project Readme

PgPartitioning¶ ↑

<img src=“https://codeclimate.com/github/victor-magarlamov/pg_partitioning/badges/gpa.svg” /> <img src=“https://codeclimate.com/github/victor-magarlamov/pg_partitioning/badges/coverage.svg” />

This project rocks and uses MIT-LICENSE.

Install¶ ↑

Put this line in your Gemfile:

gem 'pg_partitioning'

Then bundle:

% bundle install

Usage¶ ↑

% RAILS_ENV=production rails g partitioning

1) Select the partitioning mode:

  • by single column value

  • by dates template

  • by range

2) Enter table name.

3) Enter column name.

4) Enter condition depending on the selected mode - template pattern or range step.

What will happen then…

1) The generator will create two triggers: before insert and after insert. The before insert trigger executes the procedure that created nested table and inserts a new record into it. The after trigger clears the master table.

2) Foreign keys which reference to the master table will delete.

3) Old data will be migrated from master table to child tables.

For more details, see …

Examples¶ ↑

Given we have table ‘bandits’:

| id | name | specialization | born_at

Example 1: Partitioning by single column value¶ ↑

Enter mode: 0
Enter table: bandits
Enter column: specialization

Create two bandits:

Bandit.create([{name: 'Al Capone', specialization: 'bootlegger'},
               {name: 'Black Bart', specialization: 'robber'}])

Now we have three tables:

  • bandits - master - not contains real data

  • bandits_bootlegger - nested - contains only the bootleggers

  • bandits_robber - nested - contains only the robbers

Check this…

SELECT COUNT(*) FROM bandits; (2)
SELECT COUNT(*) FROM ONLY bandits; (0)
SELECT COUNT(*) FROM ONLY bandits_bootlegger; (1)
SELECT COUNT(*) FROM ONLY bandits_robber; (1)

Example 2: Partitioning by range¶ ↑

Enter mode: 1
Enter table: bandits
Enter column: id
Enter step: 10

All bandits with ID from 0 to 9 will be recorded to table ‘bandits_0’. All bandits with ID from 10 to 19 will be recorded to table ‘bandits_1’. All bandits with ID from 20 to 29 will be recorded to table ‘bandits_2’ etc.

Example 3: Partitioning by date template¶ ↑

Enter mode: 2
Enter table: bandits
Enter column: born_at
Enter pattern: YYYYMM

Create two bandits:

Bandit.create([{name: 'Al Capone', born_at: '1899-01-17'},
               {name: 'Charles Luciano', born_at: '1897-11-24'}])

And now we have two child tables:

  • bandits_1899_01

  • bandits_1897_11