添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
焦虑的柳树  ·  Amazon Redshift ...·  4 周前    · 
踢足球的帽子  ·  Psycopg2 vs Psycopg3 ...·  3 周前    · 
痴情的啄木鸟  ·  Q & A / PostgreSQL / ...·  2 周前    · 
大力的饺子  ·  Copilot for Microsoft ...·  6 月前    · 
慷慨的熊猫  ·  bird_pipeline_registry ...·  11 月前    · 
很酷的登山鞋  ·  kthread 内核线程 — ...·  1 年前    · 
Zenn
🐘

世の中のPostgreSQLエンジニアのpsql設定

2022/07/20 に公開

先日、この記事( 世の中のエンジニアのalias設定 )読んで、PostgreSQLエンジニアの私はbashだけでなくpsqlの設定はどうなっているんだと気になったので、GitHubのリポジトリを調査してみました。

  • ドキュメント PostgreSQL Wiki を参考にしてください。
  • GitHub APIを用いてGitHub上の psqlrc という単語を含むファイルのURLを抽出
  • ファイルの中身をPostgreSQLに挿入して、よく用いられる設定を解析
  • Search API を用いる。ポイントは以下

  • GitHub APIは最大1,000件までしか結果を返してくれないのでファイルサイズで細かくスライスしてAPIコール
  • 1ページ当たり100件の結果しか返してくれないので全ページを取得できるように for 文で繰り返し
  • 短時間にリクエストを送りすぎるとGitHubに怒られるので適度に sleep を挿入
  • extract_psqlrc.sh
    #!/bin/bash
    GITHUB_TOKEN=hoge #自身のGitHubのトークンを設定
    # API call 0 to 1000 bytes
    for size in `seq 0 50 950`;
      for page in `seq 10`;
        curl -ksS \
          -H "Accept: application/vnd.github.v3+json" \
          -H "Authorization: token ${GITHUB_TOKEN}" \
          -o results/${size}-$((size+49))-${page}.json \
          "https://api.github.com/search/code?q=filename:psqlrc+size:${size}..$((size+49))&per_page=100&page=${page}"
        sleep 60
    # API call over 1000 bytes
    for page in `seq 10`;
      curl -ksS \
        -H "Accept: application/vnd.github.v3+json" \
        -H "Authorization: token ${GITHUB_TOKEN}" \
        -o results/1000-1049-${page}.json \
        "https://api.github.com/search/code?q=filename:psqlrc+size:>1000&per_page=100&page=${page}"
      sleep 60
    # extract html_url
    for size in `seq 0 50 1000`;
      for page in `seq 10`;
        cat results/${size}-$((size+49))-${page}.json | \
        jq -r ".items[] | .html_url" | \
        sed "s#/blob/#/raw/#g" >> results/url_list.txt
    

    \set QUIETに書きましたが、psqlrcの初めに\set QUIET ONとして、psqlrcの最後に\set QUIET OFFとして、psqlrc内の処理を出力しないようにしているようです。

  • https://github.com/okbob/pspg
  • SELECT
      statement,
      COUNT(statement) AS count
    FROM psqlrc
    GROUP BY lower(split_part(statement, ' ', 1)), statement           
    HAVING 
      lower(split_part(statement, ' ', 1)) = '\setenv' AND
      lower(split_part(statement, ' ', 2)) = 'editor'
    ORDER BY count DESC
    LIMIT 10;
                    statement                 | count 
    ------------------------------------------+-------
     \setenv EDITOR 'nvim'                    |     5
     \setenv EDITOR 'vim'                     |     5
     \setenv EDITOR '/usr/bin/vim'            |     5
     \setenv EDITOR '/usr/local/bin/vim'      |     4
     \setenv EDITOR vim                       |     3
     \setenv EDITOR '/usr/bin/nvim'           |     2
     \setenv EDITOR emacs                     |     2
     \setenv EDITOR nvim                      |     2
     \setenv EDITOR '~/.nix-profile/bin/nvim' |     2
     \setenv EDITOR /usr/bin/vim              |     1
    (10 rows)
    

    環境変数EDITORPSQL_EDITORを設定することでエディタにNeovimやVim、Emacsを使用しているようです。

    psqlのメタコマンドかと思いきや、改行コードが引っかかっただけな気がします…。

    SELECT
      lower(split_part(statement, ' ', 1)) AS item1,
      lower(split_part(statement, ' ', 2)) AS item2,
      COUNT(statement) AS count
    FROM psqlrc
    GROUP BY item1, item2           
    HAVING lower(split_part(statement, ' ', 1)) = 'set'
    ORDER BY count DESC
    LIMIT 30;
     item1 |                         item2                          | count 
    -------+--------------------------------------------------------+-------
     set   | search_path                                            |    47
     set   | intervalstyle                                          |    41
     set   | timezone                                               |     9
     set   | application_name                                       |     7
     set   | client_min_messages                                    |     6
     set   | bytea_output                                           |     5
     set   | client_encoding                                        |     4
     set   | search_path=public;                                    |     1
     set   | session                                                |     1
     set   | search_path=site_config_service,project_service,public |     1
     set   | work_mem                                               |     1
     set   | timezone='us/eastern';                                 |     1
     set   | default_transaction_read_only                          |     1
     set   | search_path=dwh,mart,stage                             |     1
     set   | tcp_keepalives_idle                                    |     1
     set   | maintenance_work_mem='1gb';                            |     1
     set   | search_path=public,postgis                             |     1
     set   | work_mem='512mb';                                      |     1
     set   | enable_bitmapscan                                      |     1
     set   | statement_timeout                                      |     1
    (20 rows)
    
    SELECT
      statement,
      COUNT(statement) AS count
    FROM psqlrc
    GROUP BY lower(split_part(statement, ' ', 1)), statement           
    HAVING 
      lower(split_part(statement, ' ', 1)) = 'set' AND
      lower(split_part(statement, ' ', 2)) = 'search_path'
    ORDER BY count DESC
    LIMIT 10;
                           statement                        | count 
    --------------------------------------------------------+-------
     set search_path to pdfbox,mycore,public;               |     3
     set search_path to setcore,public;                     |     3
     set search_path to curl7,mycore,public;                |     3
     set search_path to jsonorg,setcore,public;             |     3
     set search_path to mycore,setcore,public;              |     3
     set search_path to public,setcore,libxml2;             |     3
     SET search_path TO setcore,public;                     |     3
     SET search_path TO expat2,mycore,setcore,public;       |     3
     set search_path to gnuzip,setcore,public;              |     3
     SET search_path TO arxiv,pdfbox,mycore,setcore,public; |     2
    (10 rows)
    
    SELECT
      statement,
      COUNT(statement) AS count
    FROM psqlrc
    GROUP BY lower(split_part(statement, ' ', 1)), statement           
    HAVING 
      lower(split_part(statement, ' ', 1)) = 'set' AND
      lower(split_part(statement, ' ', 2)) = 'intervalstyle'
    ORDER BY count DESC
    LIMIT 10;
                    statement                 | count 
    ------------------------------------------+-------
     set intervalstyle to 'postgres_verbose'; |    39
     SET intervalstyle to 'postgres_verbose'; |     1
     set intervalstyle to 'postgres_verbose'  |     1
    (3 rows)
    

    SET search_path TO hogeでスキーマ検索パスを独自のものに設定したり、SET intervalstyle TO 'postgres_verbose'で時間間隔の出力をpostgres_verbose書式の出力にしているようです。

  • https://www.postgresql.jp/document/current/html/ddl-schemas.html#DDL-SCHEMAS-PATH
  • https://www.postgresql.jp/document/current/html/datatype-datetime.html#DATATYPE-INTERVAL-OUTPUT
  •