Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Write Postgres Extensions with Rust!

Write Postgres Extensions with Rust!

I will introduce you how to write PostgreSQL's extensions with Rust.
pgx(https://github.com/zombodb/pgx) is a framework that helps developing extensions.

The LT took place on December 22, 2020 at Shinjuku.rs # 13 (https://forcia.connpass.com/event/194229/).

F0493f5bcb4cc9fdccc54ae3e8ab6bd0?s=128

Kentaro Matsumoto

December 22, 2020
Tweet

Transcript

  1. Write Postgres Extensions with Rust!
 @matsu7874
 2020.12.22 Shinjuku.rs #13


  2. 自己紹介 • 松本健太郎 (Kentaro MATSUMOTO) @matsu7874 • ソフトウェアエンジニア@フォルシア株式会社 ◦ Rustでインメモリデータベースを開発

    ◦ インターンの企画とか技術広報とか • 興味 ◦ Webアプリケーション ◦ 技術広報・エンジニア採用 ◦ 競技プログラミング 2
  3. 『実践Rustプログラミング入門』 共著 • 8月22日発売 ¥3,600(税別) 秀和システム • 12月1日 Kindle版発売! • 360/508ページくらい実践的な内容

    ◦ Webアプリ ◦ WebAssembly ◦ GUI ◦ 組み込み ◦ プロダクションで使う話など • Shinjuku.rsで知り合ったエンジニアで共著 3
  4. 目次 • PostgreSQLのユーザー定義関数 • pgxとは • デモ 4 参考 『RustでPostgreSQLのユーザー定義関数を書く』

     https://www.forcia.com/blog/001560.html

  5. PostgreSQLのユーザー定義関数 • PostgreSQLは関数を定義することができる • C言語関数と呼ばれるタイプのユーザー定義関数がある ◦ 動的ロード可能なオブジェクトファイルとしてコンパイル ◦ PL/pgSQL, PL/Pythonより高速!

    ◦ C(もしくはCと互換性のある言語)で作成できる ▪ Rustで実装するぞ! 5
  6. pgxとは • RustでPostgreSQL拡張を書くためのフレームワーク ◦ Rustを書くとPostgreSQL向けにコンパイルしてくれる ◦ バージョン10,11,12,13(2020/09リリースの最新版)に対応 ◦ ZomboDBが開発している     

    6
  7. pgxの導入 $ cargo install cargo-pgx
 $ cargo pgx init
 


    
 7 • テスト用のPostgreSQL 10~13がインストールされる
  8. サンプルプログラム:コラッツの問題 • 終了までのループ回数を出力 • n == 1 ⇒ 終了 •

    n%2 == 0 ⇒ n=n/2 • n%2 == 1 ⇒ n=3*n+1 8
  9. C・Rustでの実装例 9

  10. 構造体を定義する • pubな構造体を定義して • #[derive(PostgresType, Serialize, Deserialize)]するとよい ◦ assert_eq!観点ではDebug,PartialEqもあるとうれしい 10

  11. 2種類のテスト • cargo test ◦ Rustの標準的なユニットテスト • cargo pgx test

    pg13 ◦ PostgreSQL13を使ったテストが書ける 11
  12. デモ 12

  13. デモ 13

  14. デモ 14

  15. デモ 15

  16. デモ 16

  17. ハマったところ • 構造体xxxに対して、2つの関数が生成される ◦ 関数xxx_in(cstring)->xxx ◦ 関数xxx_out(xxx)->cstring ◦ PostgreSQLに実装されている型、例えばpoint型などと被る ◦

    関数定義のSQLを見れば原因がわかる! • 型パラメータを持った構造体はNG • 構造体のメソッドは別の関数経由で呼び出す • pg_externの関数でusizeを引数に取れないがエラーにならない。 17
  18. pgxを使ってRustで PostgreSQL拡張を書こう 18