web-dev-qa-db-ja.com

バックアップスクリプトをテンプレートとして使用するときにbyteaデータを操作する方法

PostgreSQLデータベースに設定が保存されている、多くの設定可能なオプションがあるWebアプリを使用したプロジェクトがあります。ほとんどのフィールドはtextまたはintsですが、byteaにデコードされたJSONとして保存される構成がいくつかあります。

私のチーム(ソフトウェア品質保証)が全員のテストサーバーを同じページに配置するために使用する「デフォルト構成」セットアップスクリプトが1つあります。このスクリプトは、Webアプリを介してデータを手動で作成し、構成を保存するのに数時間かかります。データベースを同じ構成にするために必要なcreate/insertステートメントとSQLファイルを共有するだけで、チームのセットアップ時間を節約したいと思います。

したがって、次のようなスクリプトを使用します。

CREATE DATABASE example;

...

CREATE TABLE example_table (
    id integer NOT NULL,
    ip_address text,
    domain text,
    configuration bytea
);

...

COPY example_table (id, ip_address, domain, configuration) FROM stdin;
1   0.0.0.0 invalid.domain.com  \x7b277265666572656e63655f746f5f69705f61646472657373273a27302e302e302e30272c277265666572656e63655f746f5f646f6d61696e273a27696e76616c69642e646f6d61696e2e636f6d277d
\.

--- The above bytearray is "{'reference_to_ip_address':'0.0.0.0','reference_to_domain':'invalid.domain.com'}"

当初、私の考えは、「0.0.0.0」と「invalid.domain.com」をユーザーが望むものに置き換えることでした。その後、ユーザーはスクリプトを実行して、データベースを共通の構成でセットアップしました。ただし、エンコードされたデータを使用すると、最終結果にはサーバーのIPアドレスとドメインへの無効な参照が含まれます。誰かがこのような問題を抱えて解決策を見つけたことがありますか?これを行うためのより良い方法はありますか?私はデータベース構成を変更する以外の提案を受け入れます(私はそれを振り回すことはできません)。

1
codebycaleb

使用する代わりに...

COPY example_table (id, ip_address, domain, configuration) FROM stdin;
1   0.0.0.0 invalid.domain.com  \x7b277265666572656e63655f746f5f69705f61646472657373273a27302e302e302e30272c277265666572656e63655f746f5f646f6d61696e273a27696e76616c69642e646f6d61696e2e636f6d277d
\.

...パターンを変更して次のようなことができるはずだと思います...

INSERT INTO 
    example_table 
    (id, ip_address, domain, configuration) 
VALUES 
    (1, '0.0.0.0', 'invalid.domain.com', 
    $quote${"reference_to_ip_address":'0.0.0.0',
            "reference_to_domain":'invalid.domain.com'}$quote$::bytea) ;

...または、少し簡単にしたい場合は、共通テーブル式を使用すると、設定を1か所で変更するだけで済みます。

WITH reference_data(id, ip_address, domain) AS
(
    -- This is the only place that needs changing...
    VALUES (1, '0.0.0.0', 'invalid.domain.com')
)
INSERT INTO
    example_table 
    (id, ip_address, domain, configuration) 
SELECT
    id, ip_address, domain, 
    ('{"reference_to_ip_address":''' || ip_address || ''',' ||
     '"reference_to_domain":''' || domain || '''}')::bytea 
FROM
    reference_data ;

データを確認できます

 SELECT 
     id, ip_address, domain, convert_from(configuration, 'utf8')
 FROM
     example_table ;
 id | ip_address |ドメイン| convert_from
-:| :--------- | :----------------- | :------------------------------------------------- ------------------------------ 1 | 0.0.0.0 | invalid.domain.com | {"reference_to_ip_address": '0.0.0.0'、 "reference_to_domain": 'invalid.domain.com'} 1 | 0.0.0.0 | invalid.domain.com | {"reference_to_ip_address": '0.0.0.0'、 "reference_to_domain": 'invalid.domain.com'}  
0
joanolo