やりたいこと
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') ;