差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
rust:diesel [2024/05/21 17:55] – [diesel] ともやんrust:diesel [2024/06/04 17:41] (現在) – [データベース データ型との対応関係のヒント] ともやん
行 2: 行 2:
 本家: [[https://diesel.rs/|Diesel is a Safe, Extensible ORM and Query Builder for Rust]]\\ 本家: [[https://diesel.rs/|Diesel is a Safe, Extensible ORM and Query Builder for Rust]]\\
 ソースコード: [[git>diesel-rs/diesel|diesel-rs/diesel: A safe, extensible ORM and Query Builder for Rust]]\\ ソースコード: [[git>diesel-rs/diesel|diesel-rs/diesel: A safe, extensible ORM and Query Builder for Rust]]\\
 +マイグレーションガイド: [[https://diesel.rs/guides/migration_guide.html|Diesel 2.0 migration guide]]\\
 ===== インストール ===== ===== インストール =====
 公式: [[https://diesel.rs/guides/getting-started|Getting Started with Diesel]]\\ 公式: [[https://diesel.rs/guides/getting-started|Getting Started with Diesel]]\\
行 154: 行 154:
  
 ===== データベース ===== ===== データベース =====
-[[linux:podman:piwigo|Piwigo - オープンソースの写真管理 Web アプリ]] を使用する😅\\+**PostgreSQL**\\ 
 +[[linux:podman:postgres|PostgreSQL]] (Podman)\\ 
 + 
 +**MariaDB**\\ 
 +[[linux:podman:piwigo|Piwigo - オープンソースの写真管理 Web アプリ]] (Podman) を使用する😅\\ 
 + 
 +**SQLite**\\ 
 +構築の必要はない\\
  
 ===== ワークスペースの作成 ===== ===== ワークスペースの作成 =====
行 374: 行 381:
 </WRAP> </WRAP>
  
-==== diesel ====+==== Diesel ==== 
 + 
 +=== データベース接続設定 === 
 +Diesel でデータベース接続するために、.env ファイルに DATABASE_URL 環境変数を設定する...🤔\\ 
 +データベースは Podman のコンテナ内であるため、UNIX ドメインソケットではなく TCP/IP ソケット通信する必要があるので、ローカルホストは IPv6/IPv4 アドレスを指定する😉\\
 <WRAP color_term> <WRAP color_term>
 <WRAP color_command><html><pre> <WRAP color_command><html><pre>
 +<font color="#0087FF"><b>$</b></font> <font color="#26A269">echo</font> DATABASE_URL=mysql://piwigo:piwigo@<font color="#12488B"><b>[</b></font>::1<font color="#12488B"><b>]</b></font>:3306/piwigo_db <font color="#12488B"><b>&gt;</b></font> <u style="text-decoration-style:solid">.env</u>
 +or
 <font color="#0087FF"><b>$</b></font> <font color="#26A269">echo</font> DATABASE_URL=mysql://piwigo:piwigo@127.0.0.1:3306/piwigo_db <font color="#12488B"><b>&gt;</b></font> <u style="text-decoration-style:solid">.env</u> <font color="#0087FF"><b>$</b></font> <font color="#26A269">echo</font> DATABASE_URL=mysql://piwigo:piwigo@127.0.0.1:3306/piwigo_db <font color="#12488B"><b>&gt;</b></font> <u style="text-decoration-style:solid">.env</u>
 <font color="#0087FF"><b>$</b></font> <font color="#26A269">diesel</font> setup <font color="#0087FF"><b>$</b></font> <font color="#26A269">diesel</font> setup
-</pre></html></WRAP> 
-<WRAP color_result><html><pre> 
 </pre></html></WRAP> </pre></html></WRAP>
 </WRAP> </WRAP>
  
 +<html><code>--features</code></html> に仕様する RDBMS に応じて <html><code>postgres|mysql|sqlite</code></html> を指定する🤔\\
 +複数指定する場合はカンマ区切りで指定できる😉\\
 <WRAP color_term> <WRAP color_term>
 <WRAP color_command><html><pre> <WRAP color_command><html><pre>
 +<font color="#0087FF"><b>$</b></font> <font color="#26A269">cargo</font> a<font color="#999999">dd diesel </font><font color="#A347BA">--features</font><font color="#999999"> postgres,mysql</font>
 +or
 <font color="#0087FF"><b>$</b></font> <font color="#26A269">cargo</font> add diesel <font color="#A347BA">--features</font> mysql <font color="#0087FF"><b>$</b></font> <font color="#26A269">cargo</font> add diesel <font color="#A347BA">--features</font> mysql
 </pre></html></WRAP> </pre></html></WRAP>
行 421: 行 436:
 </pre></html></WRAP> </pre></html></WRAP>
 </WRAP> </WRAP>
 +
 +=== UNIX ドメインソケット経由の接続エラー ===
 +UNIX ドメインソケット経由でローカルサーバーに接続できない場合は…🤪\\
 +<WRAP color_term>
 +<WRAP color_command><html><pre>
 +<font color="#0087FF"><b>$</b></font> <font color="#26A269">echo</font> DATABASE_URL=mysql://piwigo:piwigo@l<font color="#999999">ocalhost:3306/piwigo_db </font><font color="#12488B"><b>&gt;</b></font><font color="#999999"> </font><font color="#999999"><u style="text-decoration-style:solid">.env</u></font>
 +<font color="#0087FF"><b>$</b></font> <font color="#26A269">diesel</font> setup
 +</pre></html></WRAP>
 +<WRAP color_result><html><pre>
 +Creating database: piwigo_db
 +Can&apos;t connect to local server through socket &apos;/var/lib/mysql/mysql.sock&apos; (2)
 +</pre></html></WRAP>
 +</WRAP>
 +
 +ホストをIPv6 アドレス<html><code>@[::1]:3306</code></html> または IPv4 アドレス<html><code>@127.0.0.1:3306</code></html> で指定する🤔\\
 +<WRAP color_term>
 +<WRAP color_command><html><pre>
 +<font color="#0087FF"><b>$</b></font> <font color="#26A269">echo</font> DATABASE_URL=mysql://piwigo:piwigo@<font color="#12488B"><b>[</b></font>::1<font color="#12488B"><b>]</b></font>:3306/piwigo_db <font color="#12488B"><b>&gt;</b></font> <u style="text-decoration-style:solid">.env</u>
 +or
 +<font color="#0087FF"><b>$</b></font> <font color="#26A269">echo</font> DATABASE_URL=mysql://piwigo:piwigo@127.0.0.1:3306/piwigo_db <font color="#12488B"><b>&gt;</b></font> <u style="text-decoration-style:solid">.env</u>
 +<font color="#0087FF"><b>$</b></font> <font color="#26A269">diesel</font> setup
 +</pre></html></WRAP>
 +</WRAP>
 +
 +以下の mysql コマンドの仕様と同じ🤔\\
 +{{page>linux:mysql#unix_ドメインソケット経由の接続エラー&noheader}}
 +
 +=== RDBMS スキーマーから src/schema.rs を生成する ===
 +Diesel の print-schema コマンドでデータベース スキーマのテーブル定義を Rust ソースコードで出力できる🤔\\
 +<WRAP color_term>
 +<WRAP color_command><html><pre>
 +<font color="#0087FF"><b>$</b></font> <font color="#26A269">diesel</font> print-schema <font color="#A347BA">-o</font> piwigo_images <font color="#12488B"><b>|</b></font> <font color="#26A269">bat</font> <font color="#A347BA">-p</font> <font color="#A347BA">-l</font> rs <font color="#A347BA">--pager</font> never
 +</pre></html></WRAP>
 +<WRAP color_result_long><html><pre class=Bat>
 +<font color="#75715E">// @generated automatically by Diesel CLI.</font>
 +
 +<font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#66D9EF">mod</font><font color="#F8F8F2"> </font><font color="#A6E22E">sql_types</font><font color="#F8F8F2"> {</font>
 +<font color="#F8F8F2">    #[derive(diesel::query_builder::QueryId, diesel::sql_types::SqlType)]</font>
 +<font color="#F8F8F2">    #[diesel(mysql_type(name </font><font color="#F92672">=</font><font color="#F8F8F2"> </font><font color="#E6DB74">&quot;Mediumint&quot;</font><font color="#F8F8F2">))]</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#66D9EF">struct</font><font color="#F8F8F2"> </font><font color="#A6E22E">PiwigoImagesAddedByMediumint</font><font color="#F8F8F2">;</font>
 +
 +<font color="#F8F8F2">    #[derive(diesel::query_builder::QueryId, diesel::sql_types::SqlType)]</font>
 +<font color="#F8F8F2">    #[diesel(mysql_type(name </font><font color="#F92672">=</font><font color="#F8F8F2"> </font><font color="#E6DB74">&quot;Mediumint&quot;</font><font color="#F8F8F2">))]</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#66D9EF">struct</font><font color="#F8F8F2"> </font><font color="#A6E22E">PiwigoImagesFilesizeMediumint</font><font color="#F8F8F2">;</font>
 +
 +<font color="#F8F8F2">    #[derive(diesel::query_builder::QueryId, diesel::sql_types::SqlType)]</font>
 +<font color="#F8F8F2">    #[diesel(mysql_type(name </font><font color="#F92672">=</font><font color="#F8F8F2"> </font><font color="#E6DB74">&quot;Mediumint&quot;</font><font color="#F8F8F2">))]</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#66D9EF">struct</font><font color="#F8F8F2"> </font><font color="#A6E22E">PiwigoImagesIdMediumint</font><font color="#F8F8F2">;</font>
 +<font color="#F8F8F2">}</font>
 +
 +<font color="#F8F8F2">diesel::table</font><font color="#F92672">!</font><font color="#F8F8F2"> {</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">use</font><font color="#F8F8F2"> diesel::sql_types::</font><font color="#F92672">*</font><font color="#F8F8F2">;</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">use</font><font color="#F8F8F2"> </font><font color="#F92672">super</font><font color="#F8F8F2">::sql_types::PiwigoImagesIdMediumint;</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">use</font><font color="#F8F8F2"> </font><font color="#F92672">super</font><font color="#F8F8F2">::sql_types::PiwigoImagesFilesizeMediumint;</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">use</font><font color="#F8F8F2"> </font><font color="#F92672">super</font><font color="#F8F8F2">::sql_types::PiwigoImagesAddedByMediumint;</font>
 +
 +<font color="#F8F8F2">    piwigo_images (id) {</font>
 +<font color="#F8F8F2">        id -&gt; Unsigned&lt;PiwigoImagesIdMediumint&gt;,</font>
 +<font color="#F8F8F2">        #[max_length </font><font color="#F92672">=</font><font color="#F8F8F2"> 255]</font>
 +<font color="#F8F8F2">        file -&gt; Varchar,</font>
 +<font color="#F8F8F2">        date_available -&gt; Datetime,</font>
 +<font color="#F8F8F2">        date_creation -&gt; Nullable&lt;Datetime&gt;,</font>
 +<font color="#F8F8F2">        #[max_length </font><font color="#F92672">=</font><font color="#F8F8F2"> 255]</font>
 +<font color="#F8F8F2">        name -&gt; Nullable&lt;Varchar&gt;,</font>
 +<font color="#F8F8F2">        comment -&gt; Nullable&lt;Text&gt;,</font>
 +<font color="#F8F8F2">        #[max_length </font><font color="#F92672">=</font><font color="#F8F8F2"> 255]</font>
 +<font color="#F8F8F2">        author -&gt; Nullable&lt;Varchar&gt;,</font>
 +<font color="#F8F8F2">        hit -&gt; Unsigned&lt;Integer&gt;,</font>
 +<font color="#F8F8F2">        filesize -&gt; Nullable&lt;Unsigned&lt;PiwigoImagesFilesizeMediumint&gt;&gt;,</font>
 +<font color="#F8F8F2">        width -&gt; Nullable&lt;Unsigned&lt;Smallint&gt;&gt;,</font>
 +<font color="#F8F8F2">        height -&gt; Nullable&lt;Unsigned&lt;Smallint&gt;&gt;,</font>
 +<font color="#F8F8F2">        #[max_length </font><font color="#F92672">=</font><font color="#F8F8F2"> 4]</font>
 +<font color="#F8F8F2">        coi -&gt; Nullable&lt;Char&gt;,</font>
 +<font color="#F8F8F2">        #[max_length </font><font color="#F92672">=</font><font color="#F8F8F2"> 4]</font>
 +<font color="#F8F8F2">        representative_ext -&gt; Nullable&lt;Varchar&gt;,</font>
 +<font color="#F8F8F2">        date_metadata_update -&gt; Nullable&lt;Date&gt;,</font>
 +<font color="#F8F8F2">        rating_score -&gt; Nullable&lt;Unsigned&lt;Float&gt;&gt;,</font>
 +<font color="#F8F8F2">        #[max_length </font><font color="#F92672">=</font><font color="#F8F8F2"> 255]</font>
 +<font color="#F8F8F2">        path -&gt; Varchar,</font>
 +<font color="#F8F8F2">        storage_category_id -&gt; Nullable&lt;Unsigned&lt;Smallint&gt;&gt;,</font>
 +<font color="#F8F8F2">        level -&gt; Unsigned&lt;Tinyint&gt;,</font>
 +<font color="#F8F8F2">        #[max_length </font><font color="#F92672">=</font><font color="#F8F8F2"> 32]</font>
 +<font color="#F8F8F2">        md5sum -&gt; Nullable&lt;Char&gt;,</font>
 +<font color="#F8F8F2">        added_by -&gt; Unsigned&lt;PiwigoImagesAddedByMediumint&gt;,</font>
 +<font color="#F8F8F2">        rotation -&gt; Nullable&lt;Unsigned&lt;Tinyint&gt;&gt;,</font>
 +<font color="#F8F8F2">        latitude -&gt; Nullable&lt;Double&gt;,</font>
 +<font color="#F8F8F2">        longitude -&gt; Nullable&lt;Double&gt;,</font>
 +<font color="#F8F8F2">        lastmodified -&gt; Nullable&lt;Timestamp&gt;,</font>
 +<font color="#F8F8F2">    }</font>
 +<font color="#F8F8F2">}</font>
 +</pre></html></WRAP>
 +</WRAP>
 +bat コマンドについては [[linux:bat|bat - シンタックスハイライトとGitとの連携機能付きの cat(1) クローン]] を参照😉\\
 +
 +それを <html><code>src/schema.rs</code></html> へリダイレクトで追記する😉\\
 +<WRAP color_term>
 +<WRAP color_command><html><pre>
 +<font color="#0087FF"><b>$</b></font> <font color="#26A269">diesel</font> print-schema <font color="#A347BA">-o</font> piwigo_images <font color="#12488B"><b>&gt;&gt;</b></font> <u style="text-decoration-style:solid">src/schema.rs</u>
 +</pre></html></WRAP>
 +</WRAP>
 +
 +=== schema.rs から src/models.rs を生成する ===
 +<WRAP color_term>
 +<WRAP color_command><html><pre>
 +<font color="#0087FF"><b>$</b></font> <font color="#26A269">diesel_ext</font> <font color="#A347BA">--model</font> <font color="#A347BA">-t</font> <font color="#12488B"><b>|</b></font> <font color="#26A269">bat</font> <font color="#A347BA">-p</font> <font color="#A347BA">-l</font> rs <font color="#A347BA">--pager</font> never
 +</pre></html></WRAP>
 +<WRAP color_result_long><html><pre class=Bat>
 +Unsigned&lt;PiwigoImagesIdMediumint&gt; is not recognized. Please feel free to expand the HashMap. This could provide good hints: <a href="https://kotiri.com/2018/01/31/postgresql-diesel-rust-types.html">https://kotiri.com/2018/01/31/postgresql-diesel-rust-types.html</a>
 +Nullable&lt;Unsigned&lt;PiwigoImagesFilesizeMediumint&gt;&gt; is not recognized. Please feel free to expand the HashMap. This could provide good hints: <a href="https://kotiri.com/2018/01/31/postgresql-diesel-rust-types.html">https://kotiri.com/2018/01/31/postgresql-diesel-rust-types.html</a>
 +Nullable&lt;Unsigned&lt;Float&gt;&gt; is not recognized. Please feel free to expand the HashMap. This could provide good hints: https://kotiri.com/2018/01/31/postgresql-diesel-rust-types.html
 +Unsigned&lt;PiwigoImagesAddedByMediumint&gt; is not recognized. Please feel free to expand the HashMap. This could provide good hints: <a href="https://kotiri.com/2018/01/31/postgresql-diesel-rust-types.html">https://kotiri.com/2018/01/31/postgresql-diesel-rust-types.html</a>
 +<font color="#75715E">// Generated by diesel_ext</font>
 +
 +<font color="#F8F8F2">#![allow(unused)]</font>
 +<font color="#F8F8F2">#![allow(clippy::all)]</font>
 +
 +
 +<font color="#F92672">use</font><font color="#F8F8F2"> chrono::NaiveDate;</font>
 +<font color="#F92672">use</font><font color="#F8F8F2"> chrono::NaiveDateTime;</font>
 +<font color="#F8F8F2">#[derive(Queryable, Debug)]</font>
 +<font color="#F8F8F2">#[diesel(table_name </font><font color="#F92672">=</font><font color="#F8F8F2"> piwigo_images)]</font>
 +<font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#66D9EF">struct</font><font color="#F8F8F2"> </font><font color="#A6E22E">PiwigoImage</font><font color="#F8F8F2"> {</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">id</font><font color="#F8F8F2">: </font><font color="#75715E">/* TODO: unknown type Unsigned&lt;PiwigoImagesIdMediumint&gt; */</font><font color="#F8F8F2">,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">file</font><font color="#F8F8F2">: String,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">date_available</font><font color="#F8F8F2">: NaiveDateTime,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">date_creation</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;NaiveDateTime&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">name</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#A6E22E">String</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">comment</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#A6E22E">String</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">author</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#A6E22E">String</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">hit</font><font color="#F8F8F2">: </font><font color="#66D9EF">u32</font><font color="#F8F8F2">,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">filesize</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#75715E">/* TODO: unknown type Nullable&lt;Unsigned&lt;PiwigoImagesFilesizeMediumint&gt;&gt; */</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">width</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#66D9EF">u16</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">height</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#66D9EF">u16</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">coi</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#A6E22E">String</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">representative_ext</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#A6E22E">String</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">date_metadata_update</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;NaiveDate&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">rating_score</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#75715E">/* TODO: unknown type Nullable&lt;Unsigned&lt;Float&gt;&gt; */</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">path</font><font color="#F8F8F2">: String,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">storage_category_id</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#66D9EF">u16</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">level</font><font color="#F8F8F2">: </font><font color="#66D9EF">u8</font><font color="#F8F8F2">,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">md5sum</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#A6E22E">String</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">added_by</font><font color="#F8F8F2">: </font><font color="#75715E">/* TODO: unknown type Unsigned&lt;PiwigoImagesAddedByMediumint&gt; */</font><font color="#F8F8F2">,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">rotation</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#66D9EF">u8</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">latitude</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#66D9EF">f64</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">longitude</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;</font><font color="#66D9EF">f64</font><font color="#F8F8F2">&gt;,</font>
 +<font color="#F8F8F2">    </font><font color="#F92672">pub</font><font color="#F8F8F2"> </font><font color="#FFFFFF">lastmodified</font><font color="#F8F8F2">: </font><font color="#A6E22E">Option</font><font color="#F8F8F2">&lt;NaiveDateTime&gt;,</font>
 +<font color="#F8F8F2">}</font>
 +
 +</pre></html></WRAP>
 +</WRAP>
 +
 +=== データベース データ型との対応関係のヒント ===
 +<html><script>
 +function formatBigInt(bigint) {
 +  return bigint.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
 +}
 +</script>
 +<style>
 +  th {
 +    background-color: #eee;
 +  }
 +  .xtern_xtrn {
 +  
 +  }
 +</style></html>
 +<WRAP mintbl minfont_12>
 +参考: [[https://dev.mysql.com/doc/refman/8.0/en/integer-types.html|MySQL :: MySQL 8.0 Reference Manual :: 13.1.2 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT]]\\
 +^  タイプ ^  ストレージ (Bytes)  ^  符号付き最小値  ^  符号なしの最小値  ^  符号付き最大値  ^^  符号なしの最大値  ^^
 +|  TINYINT |  1 |  -128 |  0 |  127 | |  255 | |
 +|  SMALLINT |  2 |  -32,768 |  0 |  32,767 | |  65,535 | |
 +|  MEDIUMINT |  3 |  -8,388,608 |  0 |  8,388,607 | |  16,777,215 | |
 +|  INT |  4 |  -2,147,483,648 |  0 |  2,147,483,647 | |  4,294,967,295 | |
 +|  BIGINT |  8 |  -263 |  0 |  <html><script>document.write(formatBigInt(2n ** 63n -1n))</script></html> | 2<html><sup>63</sup></html>-1  |  <html><script>document.write(formatBigInt(2n ** 64n -1n))</script></html> | 2<html><sup>64</sup></html>-1  |
 +</WRAP>
 +<WRAP mintbl minfont_12>
 +[[https://docs.diesel.rs/master/diesel/sql_types/|diesel::sql_types - Rust]]\\
 +[[https://docs.rs/min_max_traits/latest/min_max_traits/|min_max_traits - Rust]]\\
 +^ 符号なし整数型  ^^^^^
 +^  タイプ ^  最小値  ^^  最大値  ^^
 +|  u8 |  0 ||  <html><script>document.write(formatBigInt(2n ** 8n -1n))</script></html> | 2<html><sup>8</sup></html>-1  |
 +|  u16 |  0 ||  <html><script>document.write(formatBigInt(2n ** 16n -1n))</script></html> | 2<html><sup>16</sup></html>-1  |
 +|  u32 |  0 ||  <html><script>document.write(formatBigInt(2n ** 32n -1n))</script></html> | 2<html><sup>32</sup></html>-1  |
 +|  u64 |  0 ||  <html><script>document.write(formatBigInt(2n ** 64n -1n))</script></html> | 2<html><sup>64</sup></html>-1  |
 +|  u128 |  0 ||  <WRAP minfont9><html><script>document.write(formatBigInt(2n ** 128n -1n))</script></html></WRAP> | 2<html><sup>128</sup></html>-1  |
 +^ 符号付き 2 の補数整数型  ^^^^^
 +^  タイプ ^  最小値  ^^  最大値  ^^
 +|  i8 |  <html><script>document.write(formatBigInt(-(2n ** 7n)))</script></html> | -(2<html><sup>7</sup></html>) |  <html><script>document.write(formatBigInt(2n ** 7n -1n))</script></html> | 2<html><sup>7</sup></html>-1 |
 +|  i16 |  <html><script>document.write(formatBigInt(-(2n ** 15n)))</script></html> | -(2<html><sup>15</sup></html>) |  <html><script>document.write(formatBigInt(2n ** 15n -1n))</script></html> | 2<html><sup>15</sup></html>-1 |
 +|  i32 |  <html><script>document.write(formatBigInt(-(2n ** 31n)))</script></html> | -(2<html><sup>31</sup></html>) |  <html><script>document.write(formatBigInt(2n ** 31n -1n))</script></html> | 2<html><sup>31</sup></html>-1 |
 +|  i64 |  <html><script>document.write(formatBigInt(-(2n ** 63n)))</script></html> | -(2<html><sup>63</sup></html>) |  <html><script>document.write(formatBigInt(2n ** 63n -1n))</script></html> | 2<html><sup>63</sup></html>-1 |
 +|  i128 |  <WRAP minfont9><html><script>document.write(formatBigInt(-(2n ** 127n)))</script></html></WRAP> | -(2<html><sup>127</sup></html>) |  <WRAP minfont9><html><script>document.write(formatBigInt(2n ** 127n -1n))</script></html></WRAP> | 2<html><sup>127</sup></html>-1 |
 +</WRAP>
 +
 +[[https://gist.github.com/steveh/7c7145409a5eed6b698ee8b609b6d1fc|postgresql-diesel-rust-types.md]]\\
 +<WRAP mintbl minfont_12>
 +^ PostgreSQL Type  ^ PostgreSQL Size  ^ Description  ^ Range  ^ Diesel Type  ^ Rust Type  ^
 +| Nullable Types  |  | nullable  |  | [[http://docs.diesel.rs/diesel/sql_types/struct.Nullable.html|Nullable]]<T>  | [[https://doc.rust-lang.org/std/option/enum.Option.html|Option]]<T>  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-numeric.html|Numeric Types]]  ^^^^^^
 +| smallint, int2  | 2 bytes  | signed integer  | -32768 to +32767  | [[http://docs.diesel.rs/diesel/sql_types/struct.SmallInt.html|SmallInt]]  | [[https://doc.rust-lang.org/std/primitive.i16.html|i16]]  |
 +| integer, int, int4  | 4 bytes  | signed integer  | -2147483648 to +2147483647  | [[http://docs.diesel.rs/diesel/sql_types/struct.Integer.html|Integer]]  | [[https://doc.rust-lang.org/std/primitive.i32.html|i32]]  |
 +| bigint, int8  | 8 bytes  | signed integer  | -9223372036854775808 to +9223372036854775807  | [[http://docs.diesel.rs/diesel/sql_types/struct.BigInt.html|BigInt]]  | [[https://doc.rust-lang.org/std/primitive.i64.html|i64]]  |
 +| numeric(p, s), decimal(p, s)  | 2 bytes per 4 digits + 3 to 8 bytes  | exact numeric of selectable precision  | 131072.16383 digits  | [[http://docs.diesel.rs/diesel/sql_types/struct.Numeric.html|Numeric]]  | [[http://docs.diesel.rs/bigdecimal/struct.BigDecimal.html|bigdecimal::BigDecimal]]  |
 +| real, float4  | 4 bytes  | single precision floating-point number | 6 digits precision  | [[http://docs.diesel.rs/diesel/sql_types/struct.Float.html|Float]]  | [[https://doc.rust-lang.org/std/primitive.f32.html|f32]]  |
 +| double precision, float8  | 8 bytes  | double precision floating-point number | 15 digits precision  | [[http://docs.diesel.rs/diesel/sql_types/struct.Double.html|Double]]  | [[https://doc.rust-lang.org/std/primitive.f64.html|f64]]  |
 +| smallserial, serial2  | 2 bytes  | autoincrementing integer  | 1 to 32767  | [[http://docs.diesel.rs/diesel/sql_types/struct.SmallInt.html|SmallInt]]  | [[https://doc.rust-lang.org/std/primitive.i16.html|i16]]  |
 +| serial, serial4  | 4 bytes  | autoincrementing integer  | 1 to 2147483647  | [[http://docs.diesel.rs/diesel/sql_types/struct.Integer.html|Integer]]  | [[https://doc.rust-lang.org/std/primitive.i32.html|i32]]  |
 +| bigserial, serial8  | 8 bytes  | autoincrementing integer  | 1 to 9223372036854775807  | [[http://docs.diesel.rs/diesel/sql_types/struct.BigInt.html|BigInt]]  | [[https://doc.rust-lang.org/std/primitive.i64.html|i64]]  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-money.html|Monetary Types]]  ^^^^^^
 +| money  | 8 bytes  | currency amount  | -92233720368547758.08 to +92233720368547758.07  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Money.html|Money]]  | [[http://docs.diesel.rs/diesel/pg/data_types/struct.Cents.html|Cents]]  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-character.html|Character Types]]  ^^^^^^
 +| character varying(n), varchar(n)  | n+1 or n+4 bytes  | variable-length character string  |  | [[http://docs.diesel.rs/diesel/sql_types/struct.Text.html|Text]]  | [[https://doc.rust-lang.org/std/string/struct.String.html|String]], &[[https://doc.rust-lang.org/std/primitive.str.html|str]]  |
 +| character(n), char(n)  | n+1 or n+4 bytes  | fixed-length character string  |  | [[http://docs.diesel.rs/diesel/sql_types/struct.Text.html|Text]]  | [[https://doc.rust-lang.org/std/string/struct.String.html|String]], &[[https://doc.rust-lang.org/std/primitive.str.html|str]]  |
 +| text  | n+1 or n+4 bytes  | variable-length character string  |  | [[http://docs.diesel.rs/diesel/sql_types/struct.Text.html|Text]]  | [[https://doc.rust-lang.org/std/string/struct.String.html|String]], &[[https://doc.rust-lang.org/std/primitive.str.html|str]]  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-binary.html|Binary Data Types]]  ^^^^^^
 +| bytea  | n+1 to n+4 bytes  | binary data ("byte array" |  | [[http://docs.diesel.rs/diesel/sql_types/struct.Binary.html|Binary]]  | [[https://doc.rust-lang.org/std/vec/struct.Vec.html|Vec]]<[[https://doc.rust-lang.org/std/primitive.u8.html|u8]]>, &[[https://doc.rust-lang.org/std/primitive.u8.html|u8]]  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-datetime.html|Date/Time Types]]  ^^^^^^
 +| timestamp, timestamp(p) without time zone | 8 bytes  | date and time of day  | 4713 BC to 294276 AD, 1 microsecond  | [[http://docs.diesel.rs/diesel/sql_types/struct.Timestamp.html|Timestamp]]  | [[http://docs.diesel.rs/chrono/naive/struct.NaiveDateTime.html|chrono::NaiveDateTime]]  |
 +| timestamptz, timestamp(p) with time zone  | 8 bytes  | date and time of day, with time zone  | 4713 BC to 294276 AD, 1 microsecond  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Timestamptz.html|Timestamptz]]  | [[http://docs.diesel.rs/chrono/struct.DateTime.html|chrono::DateTime]]  |
 +| date  | 4 bytes  | calendar date (year, month, day)  | 4713 BC to 5874897 AD, 1 day  | [[http://docs.diesel.rs/diesel/sql_types/struct.Date.html|Date]]  | [[http://docs.diesel.rs/chrono/naive/struct.NaiveDate.html|chrono::NaiveDate]]  |
 +| time, time(p) without time zone  | 8 bytes  | time of day (no date)  | 00:00:00 to 24:00:00, 1 microsecond  | [[http://docs.diesel.rs/diesel/sql_types/struct.Time.html|Time]]  | [[http://docs.diesel.rs/chrono/naive/struct.NaiveTime.html|chrono::NaiveTime]]  |
 +| timetz, time(p) with time zone  | 12 bytes  | time of day (no date), with time zone  | 00:00:00+1459 to 24:00:00-1459, 1 microsecond  |  |
 +| interval(fields)(p)  | 16 bytes  | time span  | -178000000 years to 178000000 years, 1 microsecond | [[http://docs.diesel.rs/diesel/sql_types/struct.Interval.html|Interval]]  | [[http://docs.diesel.rs/diesel/pg/data_types/struct.PgInterval.html|PgInterval]]  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-boolean.html|Boolean Type]]  ^^^^^^
 +| boolean, bool  | 1 byte  | logical Boolean (true/false)  |  | [[http://docs.diesel.rs/diesel/sql_types/struct.Bool.html|Bool]]  | [[https://doc.rust-lang.org/std/primitive.bool.html|bool]]  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-geometric.html|Geometric Types]]  ^^^^^^
 +| point (x,y)  | 16 bytes  | geometric point on a plane  |  |
 +| line {A,B,C}  | 32 bytes  | infinite line on a plane  |  |
 +| lseg ((x1,y1),(x2,y2))  | 32 bytes  | finite line segment on a plane  |  |
 +| box ((x1,y1),(x2,y2))  | 32 bytes  | rectangular box on a plane  |  |
 +| path ((x1,y1),...)  | 16+16n bytes  | closed geometric path on a plane  |  |
 +| path [(x1,y1),...]  | 16+16n bytes  | open geometric path on a plane  |  |
 +| polygon ((x1,y1),...)  | 40+16n bytes  | closed geometric path on a plane  |  |
 +| circle <(x,y),r\>  | 24 bytes  | circle on a plane  |  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-net-types.html|Network Address Types]]  ^^^^^^
 +| cidr  | 7 or 19 bytes  | IPv4 or IPv6 network address  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Cidr.html|Cidr]]  | [[http://docs.diesel.rs/ipnetwork/enum.IpNetwork.html|ipnetwork::IpNetwork]]  |
 +| inet  | 7 or 19 bytes  | IPv4 or IPv6 host address  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Inet.html|Inet]]  | [[http://docs.diesel.rs/ipnetwork/enum.IpNetwork.html|ipnetwork::IpNetwork]]  |
 +| macaddr  | 6 bytes  | MAC address  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.MacAddr.html|MacAddr]]  | %%[%%[[https://doc.rust-lang.org/std/primitive.u8.html|u8]]; 6]  |
 +| macaddr8  | 8 bytes  | MAC address (EUI-64 format)  |  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-enum.html|Enumerated Types]]  ^^^^^^
 +| enum  | 4 bytes  | enumerated value  |  | (user-defined)  | [[https://doc.rust-lang.org/std/string/struct.String.html|String]], [[https://doc.rust-lang.org/book/first-edition/enums.html|enum]]  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-bit.html|Bit String Types]]  ^^^^^^
 +| bit(n)  | 1 byte per 8 bits + 5 or 8 bytes  | fixed-length bit string  |  |
 +| bit varying(n), varbit  | 1 byte per 8 bits + 5 or 8 bytes  | variable-length bit string  |  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-textsearch.html|Text Search Types]]  ^^^^^^
 +| tsvector  |  | text search document  |  | TsVector  |
 +| tsquery  |  | text search query  |  | TsQuery  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-uuid.html|UUID Type]]  ^^^^^^
 +| uuid  | 16 bytes  | universally unique identifier  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Uuid.html|Uuid]]  | [[https://docs.rs/uuid/0.5.1/uuid/struct.Uuid.html|uuid::Uuid]]  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-xml.html|XML Type]]  ^^^^^^
 +| xml  |  | XML data  |  |
 +^ [[https://www.postgresql.org/docs/current/static/datatype-json.html|JSON Types]]  ^^^^^^
 +| json  |  | textual JSON data  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Json.html|Json]]  | [[http://docs.diesel.rs/serde_json/value/enum.Value.html|serde_json::Value]]  |
 +| jsonb  |  | binary JSON data, decomposed  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Jsonb.html|Jsonb]]  | [[http://docs.diesel.rs/serde_json/value/enum.Value.html|serde_json::Value]]  |
 +^ [[https://www.postgresql.org/docs/current/static/arrays.html|Arrays]]  ^^^^^^
 +| t[]  |  | array of values  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Array.html|Array]]<T>  | [[https://doc.rust-lang.org/std/vec/struct.Vec.html|Vec]]<T>, [[https://doc.rust-lang.org/std/vec/struct.Vec.html|Vec]]<[[https://doc.rust-lang.org/std/option/enum.Option.html|Option]]<T>>, &[T], &%%[%%[[https://doc.rust-lang.org/std/option/enum.Option.html|Option]]<T> |
 +^ [[https://www.postgresql.org/docs/current/static/rangetypes.html|Range Types]]  ^^^^^^
 +| int4range  |  | range of integer  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Range.html|Range]]<[[http://docs.diesel.rs/diesel/sql_types/struct.Integer.html|Integer]]>  | ([[https://doc.rust-lang.org/std/collections/enum.Bound.html|Bound]]<[[https://doc.rust-lang.org/std/primitive.i32.html|i32]]>, [[https://doc.rust-lang.org/std/collections/enum.Bound.html|Bound]]<[[https://doc.rust-lang.org/std/primitive.i32.html|i32]]>)
 +| int8range  |  | range of bigint  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Range.html|Range]]<[[http://docs.diesel.rs/diesel/sql_types/struct.BigInt.html|BigInt]]>  | ([[https://doc.rust-lang.org/std/collections/enum.Bound.html|Bound]]<[[https://doc.rust-lang.org/std/primitive.i64.html|i64]]>, [[https://doc.rust-lang.org/std/collections/enum.Bound.html|Bound]]<[[https://doc.rust-lang.org/std/primitive.i64.html|i64]]>)
 +| numrange  |  | range of numeric  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Range.html|Range]]<[[http://docs.diesel.rs/diesel/sql_types/struct.Numeric.html|Numeric]]>  | ([[https://doc.rust-lang.org/std/collections/enum.Bound.html|Bound]]<[[http://docs.diesel.rs/bigdecimal/struct.BigDecimal.html|bigdecimal::BigDecimal]]>, [[https://doc.rust-lang.org/std/collections/enum.Bound.html|Bound]]<[[http://docs.diesel.rs/bigdecimal/struct.BigDecimal.html|bigdecimal::BigDecimal]]>)
 +| tsrange  |  | range of timestamp  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Range.html|Range]]<[[http://docs.diesel.rs/diesel/sql_types/struct.Timestamp.html|Timestamp]]>  | ([[https://doc.rust-lang.org/std/collections/enum.Bound.html|Bound]]<[[http://docs.diesel.rs/chrono/naive/struct.NaiveDateTime.html|chrono::NaiveDateTime]]>, [[https://doc.rust-lang.org/std/collections/enum.Bound.html|Bound]]<[[http://docs.diesel.rs/chrono/naive/struct.NaiveDateTime.html|chrono::NaiveDateTime]]>)
 +| tstzrange  |  | range of timestamptz  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Range.html|Range]]<[[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Timestamptz.html|Timestamptz]]> | ([[https://doc.rust-lang.org/std/collections/enum.Bound.html|Bound]]<[[http://docs.diesel.rs/chrono/struct.DateTime.html|chrono::DateTime]]>, [[https://doc.rust-lang.org/std/collections/enum.Bound.html|Bound]]<[[http://docs.diesel.rs/chrono/struct.DateTime.html|chrono::DateTime]]>)
 +| daterange  |  | range of date  |  | [[http://docs.diesel.rs/diesel/pg/types/sql_types/struct.Range.html|Range]]<[[http://docs.diesel.rs/diesel/sql_types/struct.Date.html|Date]]>  | ([[https://doc.rust-lang.org/std/collections/enum.Bound.html|Bound]]<[[http://docs.diesel.rs/chrono/naive/struct.NaiveDate.html|chrono::NaiveDate]]>, [[https://doc.rust-lang.org/std/collections/enum.Bound.html|Bound]]<[[http://docs.diesel.rs/chrono/naive/struct.NaiveDate.html|chrono::NaiveDate]]> |
 +</WRAP>
 +=== 参考文献 ===
 +[[so>questions/70410103/how-to-make-diesel-auto-generate-models|rust - How to make Diesel auto-generate models? - Stack Overflow]] [[gtr>https://stackoverflow.com/questions/70410103/how-to-make-diesel-auto-generate-models|翻訳]]\\
 +[[https://kotiri.com/2018/01/31/postgresql-diesel-rust-types.html|A comprehensive mapping of PostgreSQL, Diesel, and Rust types]]\\
  
  • rust/diesel.1716281715.txt.gz
  • 最終更新: 2024/05/21 17:55
  • by ともやん