Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

SupabaseのPostgres-WASM環境にDBの初期データをロードする

やりたいこと

SupabaseのPostgres-WASM環境に、PostgreSQLの教育用DBを構築したい。

問題(1)

  • DDLを含むSQL文をPostgreSQL-WASM環境のコンソールにコピー&ペーストしようとすると、ある程度の分量(100kBくらい?もっと少ない?)までは問題なく実行できる。しかし、それを超えると正常にペーストできず、途中で入力が途切れてしまう。また、以降のコンソールへの入力が正しく行なえなくなる。
  • SupabaseのPostgreSQL-WASMには"Transfer Files"というメニューがあり、ここからVM上へファイルをアップロードできるように見える。しかし、ここでファイルのアップロードボタンを押してファイルを選択しても、VM開始時のカレントディレクトリである/rootには何も表示されない。

対策(1)

実は"Transfer Files"でアップロードしたファイルは/mnt以下に保存されている。psqlから\qで抜ける(pqslを再実行する場合はpsql -U postgres)か、またはCtrl-Zでシェルへ抜けたら、ls /mntすればファイルが見える。

あとは以下のようにすればファイル中のSQLを実行できる。

  • (A) pqsl上で\i /mnt/foobar.sqlのように実行する。
  • (B) シェル上でpsql -U postgres -f /mnt/foobar.sqlのように実行する。

問題(2)

ある程度以上のデータをINSERTしようとすると、以下のメッセージが表示されPostgreSQLへの接続が切断される。 実行するファイルを分割したり、Postgres-WASM環境のVMのメモリを増やしたりしても効果がない。

psql:/mnt/mock_staff.sql:687: server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
psql:/mnt/mock_staff.sql:687: fatal: connection to server was lost

LinkedIn LearningのAdvanced SQL for Query Tuning and Performance Optimizationコースの例題データをロードしようとしたところ発生。

原因(2)

原因は今のところ不明。Postgres-WASMは32bitのLinux VMのうえでPostgreSQLを動かしているだけということなのだが…… https://github.com/snaplet/postgres-wasm/issues/45

対策 (2)

大量のINSERT文を実行する代わりにBulk insertを使えばエラーは出なくなる。

insert into employee values (1, 'Jenny Thornton');
insert into employee values (2, 'Alan Fowler');
insert into employee values (3, 'Erick Moreno');
 ...
insert into employee values (998, 'Guy Zimmerman');
insert into employee values (999, 'Stephanie Thornton');
insert into employee values (1000, 'Brendan White');

を以下のように変更すればよい。

insert into employee values (1, 'Jenny Thornton'),
                            (2, 'Alan Fowler'),
                            (3, 'Erick Moreno'),
 ...
                            (998, 'Guy Zimmerman'),
                            (999, 'Stephanie Thornton'),
                            (1000, 'Brendan White')
                            ;