Postgres: Difference between revisions

From Bitpost wiki
No edit summary
Line 1: Line 1:
=== DEV INSTALL ===
=== DEV INSTALL ===
* clone and install [https://github.com/postgres/postgres postgres]
* use mh to install postgres and libpqxx to /usr/local
cd ~/development/Libraries/c
  mh-install-postgres
git clone git@github.com:postgres/postgres.git
* set up a linux user named "postgres"
cd postgres
  # On gentoo:
mkdir default_configure && cd default_configure
../configure --prefix=/usr/local && make && sudo make install
# may need: sudo apt install libreadline-dev bison flex
# use apt search libreadline (etc)
* clone and install [https://github.com/jtv/libpqxx libpqxx]
cd ~/development/Libraries/c++
git clone git@github.com:jtv/libpqxx.git
cd libpqxx
# add pg bin folder to path
export PATH=$PATH:/usr/local/bin
mkdir default_configure && cd default_configure
  ../configure --disable-documentation && make && sudo make install
* set up a data folder where postgres will put all its data and its log:
  # You must have a postgres user; on gentoo:
  sudo useradd postgres
  sudo useradd postgres
   
  # On ubuntu:
sudo adduser postgres
# Put the password in private
* set up a data folder where postgres will put all its data and its log
  # Standardize on [/home/m/development/postgres], but always consider symlinking to a large/redundant location.
  # Standardize on [/home/m/development/postgres], but always consider symlinking to a large/redundant location.
  # Here, we are choosing to use a larger RAID drive.
  # Here, we are choosing to use a larger RAID drive.
Line 33: Line 22:


=== START SERVER ===
=== START SERVER ===
If you installed as above, this is the command to start the server:
Use mh-start-postgres to start postgres (if the server is not already running):
su postgres -c '/usr/local/bin/pg_ctl start -l /home/m/development/postgres/log.txt -D /home/m/development/postgres/data'
Or use mh-start-postgres, which will do the same thing if the server is not already running:
  mh-start-postgres
  mh-start-postgres
=== ADD A USER + DB ===
Use mh-add-postgres-db to add a user (aka role) and matching database.  The user only has access to that db (best practice).
mh-add-postgres-db [name] [pw]


=== NOSQL via JSON ===
=== NOSQL via JSON ===

Revision as of 18:45, 14 September 2018

DEV INSTALL

  • use mh to install postgres and libpqxx to /usr/local
mh-install-postgres
  • set up a linux user named "postgres"
# On gentoo:
sudo useradd postgres
# On ubuntu:
sudo adduser postgres
# Put the password in private
  • set up a data folder where postgres will put all its data and its log
# Standardize on [/home/m/development/postgres], but always consider symlinking to a large/redundant location.
# Here, we are choosing to use a larger RAID drive.
# WARNING NTFS will not let you chown a folder (you'd have to mount the whole thing as the target owner).  
# So on viper, I had to use the tiny primary drive directly, no symlink to ~m/bigdata.  Fuck off.
mkdir /spiceflow/softraid/development/postgres
cd ~/development && ln -s /spiceflow/softraid/development/postgres postgres
sudo chown -R postgres:postgres postgres /spiceflow/softraid/development/postgres
sudo chmod g+x /spiceflow/softraid/development # and any other parent that is missing this bit, so postgres user can cd to its folder

# We must init the data folder as a postgres "database cluster"
su postgres -c '/usr/local/bin/initdb -D /home/m/development/postgres/data'

START SERVER

Use mh-start-postgres to start postgres (if the server is not already running):

mh-start-postgres

ADD A USER + DB

Use mh-add-postgres-db to add a user (aka role) and matching database. The user only has access to that db (best practice).

mh-add-postgres-db [name] [pw]

NOSQL via JSON

GORGEOUS POSTGRES JSON QUERY! inject blobs of JSON, then you can crack open the json inside a cell!

   CREATE TABLE stocks (
     id integer NOT NULL,
     board_id integer NOT NULL,
     data jsonb
   );
   INSERT INTO stocks VALUES (1, 1, '{"symbol": "GOOG", "tags": ["hot", "trending"], "owned": true}');
   # returns count of data that HAS the field ingredients
   SELECT count(*) FROM stocks WHERE data ? 'ingredients';
   # ->> will return the property as integer or text (the parsed form of the attribute).
   SELECT * FROM stocks WHERE data->>'owned' = 'true';         # if data.owned == true
   # -> will return the attribute as a JSON object
   SELECT jsonb_array_elements_text(data->'tags') as tag FROM stocks WHERE id = 1;
   # returns the actual tag values, eg:
       tag
       --------------
       Improvements
       Office
       (2 rows)
   # NEXT: EXPLORE INDEXING!
   https://blog.codeship.com/unleash-the-power-of-storing-json-in-postgres/