{"id":44988,"date":"2023-11-10T23:55:54","date_gmt":"2023-04-17T01:58:54","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/"},"modified":"2024-05-04T08:24:31","modified_gmt":"2024-05-04T00:24:31","slug":"44988-2","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/","title":{"rendered":""},"content":{"rendered":"<p>\u3053\u308c\u306f\u682a\u5f0f\u4f1a\u793eLabBase \u30c6\u30c3\u30af\u30ab\u30ec\u30f3\u30c0\u30fc Advent Calendar 2022\u300116\u65e5\u76ee\u306e\u8a18\u4e8b\u3067\u3059\u3002<\/p>\n<p>\u524d\u65e5\u306e\u8a18\u4e8b\u306f @denjiry \u3055\u3093\u306ewasm\u306b\u3088\u308bReact\u4e0a\u3067\u306e\u5358\u8a9e\u30b5\u30b8\u30a7\u30b9\u30c8\u306e\u7d39\u4ecb\u3067\u3057\u305f\u3002<\/p>\n<p>\u6700\u8fd1\u306eRust\u3067\u306e\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u958b\u767a\u3067prisma\u3092\u63a1\u7528\u3057\u3066\u3044\u308b\u306e\u3067\u3059\u304c\u3001Typescript\u306b\u3088\u3063\u3066\u30b7\u30fc\u30c9\u30c7\u30fc\u30bf\u306e\u5b9a\u7fa9\u3092\u3057\u3066\u3044\u308b\u305f\u3081\u958b\u767a\u6642\u306bRust\u3068Typescript\u306e\u4e21\u65b9\u3092\u89e6\u308b\u5fc5\u8981\u304c\u3042\u308a\u3001\u982d\u306e\u5207\u308a\u66ff\u3048\u304c\u7169\u308f\u3057\u304f\u611f\u3058\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>Prisma\u306e\u30b3\u30a2\u90e8\u5206\u306b\u3064\u3044\u3066\u306fRust\u3067\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3084\u308d\u3046\u3068\u601d\u3048\u3070Rust\u3060\u3051\u3067Prisma\u3092\u5229\u7528\u3067\u304d\u308b\u306f\u305a\u3060\u3088\u306a\u3001\u3068\u601d\u3044\u306a\u304c\u3089\u65e5\u3005\u3092\u904e\u3054\u3057\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u3001\u4eca\u5e74\u306b\u306a\u3063\u3066prisma-client-rust\u304c\u6709\u5fd7\u306b\u3088\u3063\u3066\u4f5c\u6210\u3055\u308c\u305f\u306e\u3067\u3001\u81ea\u5206\u306e\u77e5\u8b58\u306e\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3082\u517c\u306d\u3066prisma-client-rust\u3092\u4f7f\u3063\u3066Rust\u3060\u3051\u3067Prisma\u3092\u5229\u7528\u3059\u308b\u3084\u308a\u65b9\u306b\u3064\u3044\u3066\u3001\u7d39\u4ecb\u3057\u3088\u3046\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<h2>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u69cb\u6210(prisma-client-rust\u5c0e\u5165\u524d)<\/h2>\n<p>database\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u914d\u4e0b\u3067prisma\u306b\u3088\u308b\u30c6\u30fc\u30d6\u30eb\u5b9a\u7fa9\u3084\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u7ba1\u7406\u3001webapp\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u914d\u4e0b\u3067Rust\u306e\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u30b3\u30fc\u30c9\u306e\u7ba1\u7406\u3092\u884c\u3063\u3066\u3044\u307e\u3059\u3002\u30b7\u30fc\u30c9\u30c7\u30fc\u30bf\u306fTypescript\u3067\u5b9f\u88c5\u3055\u308c\u3066\u304a\u308a\u3001database\u914d\u4e0b\u306bprisma-client-rust\u3092\u5c0e\u5165\u3057\u3066\u3044\u304f\u3053\u3068\u3067\u3001Typescript\u306e\u4f9d\u5b58\u6027\u3092\u6e1b\u3089\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>.\r\n\u251c\u2500\u2500 database \/\/ prisma\u306b\u3088\u308b\u30c6\u30fc\u30d6\u30eb\u5b9a\u7fa9\u306e\u7ba1\u7406\r\n\u2502   \u251c\u2500\u2500 migrations\r\n\u2502   \u251c\u2500\u2500 package.json\r\n\u2502   \u251c\u2500\u2500 schema.prisma\r\n\u2502   \u251c\u2500\u2500 src \/\/ \u30b7\u30fc\u30c9\u30c7\u30fc\u30bf\u306e\u5b9f\u88c5\u306b\u3088\u308b\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u4f5c\u6210(Typescript)\r\n\u2502   \u251c\u2500\u2500 tsconfig.json\r\n\u2502   \u2514\u2500\u2500 yarn.lock\r\n\u2514\u2500\u2500 webapp \/\/ Rust\u306e\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\r\n    \u251c\u2500\u2500 Cargo.lock\r\n    \u251c\u2500\u2500 Cargo.toml\r\n    \u251c\u2500\u2500 Dockerfile\r\n    \u251c\u2500\u2500 application\r\n    \u251c\u2500\u2500 base\r\n    \u251c\u2500\u2500 build.rs\r\n    \u251c\u2500\u2500 domain\r\n    \u251c\u2500\u2500 infrastructure\r\n    \u251c\u2500\u2500 src\r\n    \u2514\u2500\u2500 tests\r\n<\/code><\/pre>\n<h2>prisma-client-rust\u306e\u5c0e\u5165<\/h2>\n<p>installation\u306b\u5f93\u3063\u3066\u5c0e\u5165\u3092\u884c\u3063\u3066\u3044\u304d\u307e\u3059\u3002prisma-client-rust\u3068prisma-client-rust-cli\u306e2\u7a2e\u985e\u306e\u30af\u30ec\u30fc\u30c8\u304c\u5b58\u5728\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u524d\u8005\u306fOR\u30de\u30c3\u30d1\u30fc\u3068\u3057\u3066\u4f7f\u3046\u969b\u306b\u5fc5\u8981\u306a\u30af\u30ec\u30fc\u30c8\u3067\u5f8c\u8005\u306fprisma\u30b3\u30de\u30f3\u30c9\u306e\u5b9f\u884c\u306b\u5fc5\u8981\u306a\u30af\u30ec\u30fc\u30c8\u306e\u3088\u3046\u3067\u3059\u3002<\/p>\n<p>\u3044\u304f\u3064\u304b\u306e\u5c0e\u5165\u30d1\u30bf\u30fc\u30f3\u306b\u3064\u3044\u3066\u7d39\u4ecb\u304c\u3042\u308a\u307e\u3059\u304c\u3001<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">database\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u3092cargo\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u5909\u66f4\u3057\u3066<\/ul>\n<\/li>\n<\/ul>\n<p>main.rs\u3067\u3001prisma\u30b3\u30de\u30f3\u30c9(\u3068\u540c\u7b49\u306e\u632f\u308b\u821e\u3044\u3092\u3059\u308b)\u30d0\u30a4\u30ca\u30ea\u3092\u751f\u6210\u3059\u308b<br \/>\nlib.rs\u3067\u3001\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u6295\u5165\u3059\u308b\u30d8\u30eb\u30d1\u30fc\u3092\u4f5c\u6210\u3059\u308b<\/p>\n<p>\u4e0a\u8a18\u306e\u65b9\u91dd\u3067\u7f6e\u304d\u63db\u3048\u3066\u307f\u307e\u3059\u3002<\/p>\n<h3>main.rs\u3067prisma\u30b3\u30de\u30f3\u30c9(\u3068\u540c\u7b49\u306e\u632f\u308b\u821e\u3044\u3092\u3059\u308b)\u30d0\u30a4\u30ca\u30ea\u3092\u751f\u6210\u3059\u308b<\/h3>\n<p>cargo init\u3067cargo\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u914d\u4e0b\u3092cargo\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u5909\u66f4\u3057\u3066\u3001main.rs\u3092prisma-client-rust\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u901a\u308a\u306b\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># database\/Cargo.toml<\/span>\r\n<span class=\"nn\">[package]<\/span>\r\n<span class=\"py\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"database\"<\/span>\r\n<span class=\"py\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"0.1.0\"<\/span>\r\n<span class=\"py\">edition<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"2021\"<\/span>\r\n\r\n<span class=\"c\"># See more keys and their definitions at https:\/\/doc.rust-lang.org\/cargo\/reference\/manifest.html<\/span>\r\n\r\n<span class=\"nn\">[dependencies]<\/span>\r\n<span class=\"py\">anyhow<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"1.0.57\"<\/span>\r\n<span class=\"nn\">serde<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"py\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"1.0\"<\/span><span class=\"p\">,<\/span> <span class=\"py\">features<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s\">\"derive\"<\/span><span class=\"p\">]<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"nn\">prisma-client-rust<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"py\">git<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"https:\/\/github.com\/Brendonovich\/prisma-client-rust\"<\/span><span class=\"p\">,<\/span> <span class=\"py\">tag<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"0.6.3\"<\/span><span class=\"p\">,<\/span> <span class=\"py\">default-features<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span> <span class=\"py\">features<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s\">\"mysql\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"migrations\"<\/span><span class=\"p\">]<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"nn\">prisma-client-rust-cli<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"py\">git<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"https:\/\/github.com\/Brendonovich\/prisma-client-rust\"<\/span><span class=\"p\">,<\/span> <span class=\"py\">tag<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"0.6.3\"<\/span> <span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/ database\/src\/main.rs<\/span>\r\n<span class=\"k\">fn<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nn\">prisma_client_rust_cli<\/span><span class=\"p\">::<\/span><span class=\"nf\">run<\/span><span class=\"p\">();<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>.cargo\/cargo.toml\u3067\u30a8\u30a4\u30ea\u30a2\u30b9\u306e\u8a2d\u5b9a\u3092\u3059\u308b\u3053\u3068\u3067\u3001database\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306emain.rs\u306e\u30d0\u30a4\u30ca\u30ea\u3092cargo prisma\u3068\u3044\u3046\u30a8\u30a4\u30ea\u30a2\u30b9\u3067\u5b9f\u884c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059(cargo\u3067\u3053\u3046\u3044\u3063\u305f\u8a2d\u5b9a\u304c\u3067\u304d\u308b\u3053\u3068\u3092\u521d\u3081\u3066\u77e5\u308a\u307e\u3057\u305f)\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># database\/.cargo\/config.toml<\/span>\r\n<span class=\"nn\">[alias]<\/span>\r\n<span class=\"py\">prisma<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"run -p database --\"<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c\"># database\u914d\u4e0b\u3067\u306f\u3001cargo prisma\u306e\u30b3\u30de\u30f3\u30c9\u304c\u5229\u7528\u53ef\u80fd\u306b\u306a\u308b<\/span>\r\ncargo prisma <span class=\"nt\">--help<\/span>\r\n\r\n    Finished dev <span class=\"o\">[<\/span>unoptimized + debuginfo] target<span class=\"o\">(<\/span>s<span class=\"o\">)<\/span> <span class=\"k\">in <\/span>0.57s\r\n     Running <span class=\"sb\">`<\/span>target\/debug\/database <span class=\"nt\">--help<\/span><span class=\"sb\">`<\/span>\r\n\r\n\u25ed  Prisma is a modern DB toolkit to query, migrate and model your database <span class=\"o\">(<\/span>https:\/\/prisma.io<span class=\"o\">)<\/span>\r\n\r\nUsage\r\n\r\n  <span class=\"nv\">$ <\/span>prisma <span class=\"o\">[<\/span><span class=\"nb\">command<\/span><span class=\"o\">]<\/span>\r\n\r\nCommands\r\n\r\n            init   Set up Prisma <span class=\"k\">for <\/span>your app\r\n        generate   Generate artifacts <span class=\"o\">(<\/span>e.g. Prisma Client<span class=\"o\">)<\/span>\r\n              db   Manage your database schema and lifecycle\r\n         migrate   Migrate your database\r\n          studio   Browse your data with Prisma Studio\r\n          format   Format your schema\r\n\r\nFlags\r\n\r\n     <span class=\"nt\">--preview-feature<\/span>   Run Preview Prisma commands\r\n\r\nExamples\r\n\r\n  Set up a new Prisma project\r\n  <span class=\"nv\">$ <\/span>prisma init\r\n\r\n  Generate artifacts <span class=\"o\">(<\/span>e.g. Prisma Client<span class=\"o\">)<\/span>\r\n  <span class=\"nv\">$ <\/span>prisma generate\r\n\r\n  Browse your data\r\n  <span class=\"nv\">$ <\/span>prisma studio\r\n\r\n  Create migrations from your Prisma schema, apply them to the database, generate artifacts <span class=\"o\">(<\/span>e.g. Prisma Client<span class=\"o\">)<\/span>\r\n  <span class=\"nv\">$ <\/span>prisma migrate dev\r\n  \r\n  Pull the schema from an existing database, updating the Prisma schema\r\n  <span class=\"nv\">$ <\/span>prisma db pull\r\n\r\n  Push the Prisma schema state to the database\r\n  <span class=\"nv\">$ <\/span>prisma db push\r\n<\/code><\/pre>\n<h3>lib.rs\u3067\u3001\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u6295\u5165\u3059\u308b\u30d8\u30eb\u30d1\u30fc\u3092\u4f5c\u6210\u3059\u308b<\/h3>\n<h4>OR\u30de\u30c3\u30d1\u30fc\u306e\u30b3\u30fc\u30c9\u751f\u6210<\/h4>\n<p>database\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u5185\u3067prisma\u30b3\u30de\u30f3\u30c9\u304c\u5b9f\u884c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u305f\u306e\u3067\u3001OR\u30de\u30c3\u30d1\u30fc\u306e\u30b3\u30fc\u30c9\u3092\u751f\u6210\u3057\u307e\u3059\u3002schema.prisma\u306e\u30b8\u30a7\u30cd\u30ec\u30fc\u30bf\u30fc\u306e\u8a2d\u5b9a\u3067provider\u306bcargo prisma\u3092\u6307\u5b9a\u3059\u308b\u3068\u3001output\u3067\u6307\u5b9a\u3055\u308c\u305f\u30d1\u30b9\u306bRust\u306eOR\u30de\u30c3\u30d1\u30fc\u306e\u30b3\u30fc\u30c9\u304c\u751f\u6210\u3055\u308c\u308b\u3088\u3046\u3067\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>\/\/ database\/schema.prisma\r\ndatasource db {\r\n    provider = \"mysql\"\r\n    url      = env(\"DATABASE_URL\")\r\n}\r\n\r\ngenerator client {\r\n    provider = \"cargo prisma\"\r\n    output   = \"src\/db.rs\"\r\n}\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/ database\/src\/db.rs\u306b\u81ea\u52d5\u751f\u6210\u3055\u308c\u305f\u30b3\u30fc\u30c9<\/span>\r\n<span class=\"c1\">\/\/ Code generated by Prisma Client Rust. DO NOT EDIT<\/span>\r\n\r\n<span class=\"nd\">#![allow(warnings,<\/span> <span class=\"nd\">unused)]<\/span>\r\n<span class=\"k\">pub<\/span> <span class=\"k\">static<\/span> <span class=\"n\">DATAMODEL_STR<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"k\">'static<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">=<\/span>\r\n    <span class=\"nd\">include_str!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\/path\/to\/project\/database\/schema.prisma\"<\/span><span class=\"p\">);<\/span>\r\n<span class=\"k\">static<\/span> <span class=\"n\">DATABASE_STR<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"k\">'static<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"mysql\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">pub<\/span> <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">new_client<\/span><span class=\"p\">()<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Result<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">PrismaClient<\/span><span class=\"p\">,<\/span> <span class=\"p\">::<\/span><span class=\"nn\">prisma_client_rust<\/span><span class=\"p\">::<\/span><span class=\"n\">NewClientError<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nn\">PrismaClient<\/span><span class=\"p\">::<\/span><span class=\"nf\">_builder<\/span><span class=\"p\">()<\/span><span class=\"nf\">.build<\/span><span class=\"p\">()<\/span><span class=\"k\">.await<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">pub<\/span> <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">new_client_with_url<\/span><span class=\"p\">(<\/span>\r\n    <span class=\"n\">url<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Result<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">PrismaClient<\/span><span class=\"p\">,<\/span> <span class=\"p\">::<\/span><span class=\"nn\">prisma_client_rust<\/span><span class=\"p\">::<\/span><span class=\"n\">NewClientError<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nn\">PrismaClient<\/span><span class=\"p\">::<\/span><span class=\"nf\">_builder<\/span><span class=\"p\">()<\/span>\r\n        <span class=\"nf\">.with_url<\/span><span class=\"p\">(<\/span><span class=\"n\">url<\/span><span class=\"nf\">.to_string<\/span><span class=\"p\">())<\/span>\r\n        <span class=\"nf\">.build<\/span><span class=\"p\">()<\/span>\r\n        <span class=\"k\">.await<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"c1\">\/\/ \u81ea\u52d5\u751f\u6210\u3055\u308c\u305f\u30b3\u30fc\u30c9\u304c\u7d9a\u304f<\/span>\r\n<\/code><\/pre>\n<h4>prisma db seed\u306b\u76f8\u5f53\u3059\u308b\u30b3\u30fc\u30c9\u3092\u66f8\u304f<\/h4>\n<p>\u751f\u6210\u3055\u308c\u305f\u30b3\u30fc\u30c9\u3092\u5143\u306b\u30b7\u30fc\u30c9\u30c7\u30fc\u30bf\u306e\u6295\u5165\u51e6\u7406\u3092Rust\u3067\u5b9f\u88c5\u3057\u307e\u3059\u3002Typescript\u3067\u5b9f\u88c5\u3057\u3066\u3044\u305f\u3082\u306e\u304cRust\u3067\u5b9f\u88c5\u3067\u304d\u308b\u306e\u3067\u3001prisma\u5468\u308a\u306b\u3064\u3044\u3066\u3082Rust\u306e\u30b3\u30fc\u30c9\u3060\u3051\u3092\u8aad\u307f\u66f8\u304d\u3067\u304d\u308b\u72b6\u614b\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/ database\/src\/lib.rs<\/span>\r\n\r\n<span class=\"k\">mod<\/span> <span class=\"n\">db<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">mod<\/span> <span class=\"n\">seed<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">use<\/span> <span class=\"nn\">anyhow<\/span><span class=\"p\">::<\/span><span class=\"nb\">Result<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">use<\/span> <span class=\"nn\">seed<\/span><span class=\"p\">::<\/span><span class=\"nn\">service<\/span><span class=\"p\">::<\/span><span class=\"n\">create_service_seed_data<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">use<\/span> <span class=\"k\">crate<\/span><span class=\"p\">::<\/span><span class=\"nn\">db<\/span><span class=\"p\">::<\/span><span class=\"n\">new_client_with_url<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">pub<\/span> <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">seed<\/span><span class=\"p\">(<\/span><span class=\"n\">url<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Result<\/span><span class=\"o\">&lt;<\/span><span class=\"p\">()<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">let<\/span> <span class=\"n\">client<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">new_client_with_url<\/span><span class=\"p\">(<\/span><span class=\"n\">url<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"o\">?<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"c1\">\/\/ \u5404\u30b7\u30fc\u30c9\u30c7\u30fc\u30bf\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u51e6\u7406\u3092\u547c\u3073\u51fa\u3057\u3059\u308b<\/span>\r\n    <span class=\"nf\">create_service_seed_data<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"n\">client<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"o\">?<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"nf\">Ok<\/span><span class=\"p\">(())<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">\/\/ \u9069\u5f53\u306a\u30b7\u30fc\u30c9\u30c7\u30fc\u30bf\u3092\u6295\u5165\u3059\u308b\u51e6\u7406\u3067\u3059(services, service_locales\u3068\u3044\u3046\u30c6\u30fc\u30d6\u30eb\u306b\u6295\u5165\u3059\u308b\u30c7\u30fc\u30bf\u3067\u3059)<\/span>\r\n<span class=\"c1\">\/\/ database\/src\/seed\/service.rs<\/span>\r\n<span class=\"k\">use<\/span> <span class=\"nn\">anyhow<\/span><span class=\"p\">::<\/span><span class=\"nb\">Result<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">use<\/span> <span class=\"k\">crate<\/span><span class=\"p\">::<\/span><span class=\"nn\">db<\/span><span class=\"p\">::{<\/span><span class=\"n\">service<\/span><span class=\"p\">,<\/span> <span class=\"n\">LanguageCode<\/span><span class=\"p\">,<\/span> <span class=\"n\">PrismaClient<\/span><span class=\"p\">};<\/span>\r\n\r\n<span class=\"k\">struct<\/span> <span class=\"n\">ServiceLocale<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">language_code<\/span><span class=\"p\">:<\/span> <span class=\"n\">LanguageCode<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">name<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">description<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">url<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">struct<\/span> <span class=\"n\">Service<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"nb\">i32<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">service_id<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">display_order<\/span><span class=\"p\">:<\/span> <span class=\"nb\">i32<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">enable<\/span><span class=\"p\">:<\/span> <span class=\"nb\">bool<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">locales<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">ServiceLocale<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">\/\/ \u30b5\u30fc\u30d3\u30b9\u30c7\u30fc\u30bf\u3092\u8ffd\u52a0\u3059\u308b<\/span>\r\n<span class=\"k\">pub<\/span> <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">create_service_seed_data<\/span><span class=\"p\">(<\/span><span class=\"n\">prisma_client<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">PrismaClient<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Result<\/span><span class=\"o\">&lt;<\/span><span class=\"p\">()<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"c1\">\/\/ \u30b7\u30fc\u30c9\u30c7\u30fc\u30bf\u306e\u5b9a\u7fa9<\/span>\r\n    <span class=\"k\">let<\/span> <span class=\"n\">services<\/span> <span class=\"o\">=<\/span> <span class=\"nd\">vec!<\/span><span class=\"p\">[<\/span><span class=\"n\">Service<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"mi\">6<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">service_id<\/span><span class=\"p\">:<\/span> <span class=\"nn\">String<\/span><span class=\"p\">::<\/span><span class=\"nf\">from<\/span><span class=\"p\">(<\/span><span class=\"s\">\"test\"<\/span><span class=\"p\">),<\/span>\r\n        <span class=\"n\">display_order<\/span><span class=\"p\">:<\/span> <span class=\"mi\">6<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">enable<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">locales<\/span><span class=\"p\">:<\/span> <span class=\"nd\">vec!<\/span><span class=\"p\">[<\/span><span class=\"n\">ServiceLocale<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">language_code<\/span><span class=\"p\">:<\/span> <span class=\"nn\">LanguageCode<\/span><span class=\"p\">::<\/span><span class=\"n\">Ja<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"n\">name<\/span><span class=\"p\">:<\/span> <span class=\"nn\">String<\/span><span class=\"p\">::<\/span><span class=\"nf\">from<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\u30c6\u30b9\u30c8\"<\/span><span class=\"p\">),<\/span>\r\n            <span class=\"n\">description<\/span><span class=\"p\">:<\/span> <span class=\"nn\">String<\/span><span class=\"p\">::<\/span><span class=\"nf\">from<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\u30c6\u30b9\u30c8\u30b5\u30fc\u30d3\u30b9\u306e\u8aac\u660e\"<\/span><span class=\"p\">),<\/span>\r\n            <span class=\"n\">url<\/span><span class=\"p\">:<\/span> <span class=\"nn\">String<\/span><span class=\"p\">::<\/span><span class=\"nf\">from<\/span><span class=\"p\">(<\/span><span class=\"s\">\"http:\/\/example.com\"<\/span><span class=\"p\">),<\/span>\r\n        <span class=\"p\">}],<\/span>\r\n    <span class=\"p\">}];<\/span>\r\n\r\n    <span class=\"k\">for<\/span> <span class=\"n\">service<\/span> <span class=\"k\">in<\/span> <span class=\"n\">services<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">prisma_client<\/span>\r\n            <span class=\"nf\">.service<\/span><span class=\"p\">()<\/span>\r\n            <span class=\"nf\">.create<\/span><span class=\"p\">(<\/span>\r\n                <span class=\"n\">service<\/span><span class=\"py\">.service_id<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"n\">service<\/span><span class=\"py\">.display_order<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"c1\">\/\/ \u5fc5\u9808\u9805\u76ee\u4ee5\u5916\u306e\u5024\u3092SetParam\u3067\u5909\u66f4\u3067\u304d\u308b<\/span>\r\n                <span class=\"nd\">vec!<\/span><span class=\"p\">[<\/span>\r\n                    <span class=\"nn\">service<\/span><span class=\"p\">::<\/span><span class=\"nn\">SetParam<\/span><span class=\"p\">::<\/span><span class=\"nf\">SetId<\/span><span class=\"p\">(<\/span><span class=\"n\">service<\/span><span class=\"py\">.id<\/span><span class=\"p\">),<\/span>\r\n                    <span class=\"nn\">service<\/span><span class=\"p\">::<\/span><span class=\"nn\">SetParam<\/span><span class=\"p\">::<\/span><span class=\"nf\">SetEnable<\/span><span class=\"p\">(<\/span><span class=\"n\">service<\/span><span class=\"py\">.enable<\/span><span class=\"p\">),<\/span>\r\n                <span class=\"p\">],<\/span>\r\n            <span class=\"p\">)<\/span>\r\n            <span class=\"nf\">.exec<\/span><span class=\"p\">()<\/span>\r\n            <span class=\"k\">.await<\/span><span class=\"o\">?<\/span><span class=\"p\">;<\/span>\r\n\r\n        <span class=\"n\">prisma_client<\/span>\r\n            <span class=\"nf\">.service_locale<\/span><span class=\"p\">()<\/span>\r\n            <span class=\"nf\">.create_many<\/span><span class=\"p\">(<\/span>\r\n                <span class=\"n\">service<\/span>\r\n                    <span class=\"py\">.locales<\/span>\r\n                    <span class=\"nf\">.iter<\/span><span class=\"p\">()<\/span>\r\n                    <span class=\"nf\">.map<\/span><span class=\"p\">(|<\/span><span class=\"n\">locale<\/span><span class=\"p\">|<\/span> <span class=\"p\">{<\/span>\r\n                        <span class=\"p\">(<\/span>\r\n                            <span class=\"n\">service<\/span><span class=\"py\">.id<\/span><span class=\"p\">,<\/span>\r\n                            <span class=\"n\">locale<\/span><span class=\"py\">.language_code<\/span><span class=\"p\">,<\/span>\r\n                            <span class=\"n\">locale<\/span><span class=\"py\">.name<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">(),<\/span>\r\n                            <span class=\"n\">locale<\/span><span class=\"py\">.description<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">(),<\/span>\r\n                            <span class=\"n\">locale<\/span><span class=\"py\">.url<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">(),<\/span>\r\n                            <span class=\"nd\">vec!<\/span><span class=\"p\">[],<\/span>\r\n                        <span class=\"p\">)<\/span>\r\n                    <span class=\"p\">})<\/span>\r\n                    <span class=\"nf\">.collect<\/span><span class=\"p\">(),<\/span>\r\n            <span class=\"p\">)<\/span>\r\n            <span class=\"nf\">.exec<\/span><span class=\"p\">()<\/span>\r\n            <span class=\"k\">.await<\/span><span class=\"o\">?<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"nf\">Ok<\/span><span class=\"p\">(())<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u203b\u73fe\u6642\u70b9\u3067\u306fprisma db seed\u3092\u5b9f\u884c\u3057\u3066\u3082\u3001package.json\u3067\u6307\u5b9a\u3057\u305fTypescript\u306e\u30b3\u30fc\u30c9\u304c\u5b9f\u884c\u3055\u308c\u308b\u3088\u3046\u306a\u306e\u3067\u3001lib.rs\u3067\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u6295\u5165\u3059\u308b\u30d8\u30eb\u30d1\u30fc\u3092\u4f5c\u6210\u3057\u3001\u30c6\u30b9\u30c8\u5b9f\u884c\u6642\u306b\u547c\u3073\u51fa\u3059\u3088\u3046\u306b\u3057\u307e\u3059(prisma-client-rust\u304c\u958b\u767a\u3055\u308c\u3066\u3044\u304f\u3068Cargo.toml\u306b\u8a2d\u5b9a\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u3067\u3059\u306d)\u3002<\/p>\n<h3>\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u306e\u30c6\u30b9\u30c8\u3067\u5229\u7528\u3059\u308b<\/h3>\n<p>database\u5074\u3067\u8ffd\u52a0\u3057\u305f\u51e6\u7406\u3092\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u5074\u3067\u5229\u7528\u3057\u307e\u3059\u3002<\/p>\n<h4>prisma\u306b\u3088\u308bmigration\u306e\u5b9f\u884c\u3068\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u6295\u5165<\/h4>\n<p>\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306b\u3064\u3044\u3066\u306fcargo prisma\u30b3\u30de\u30f3\u30c9\u3092std::process::Command\u3067\u5b9f\u884c\u3059\u308b\u3053\u3068\u3067\u5b9f\u884c\u3057\u3001\u30b7\u30fc\u30c9\u30c7\u30fc\u30bf\u306e\u6295\u5165\u306b\u3064\u3044\u3066\u306fdatabase\/src\/lib.rs\u3067\u4f5c\u6210\u3057\u305f\u30b7\u30fc\u30c9\u6295\u5165\u95a2\u6570\u3092\u547c\u3073\u51fa\u3059\u3053\u3068\u3067\u5b9f\u884c\u3057\u307e\u3059\u30021\u5ea6\u3060\u3051\u5b9f\u884c\u3057\u305f\u3044\u306e\u3067\u3001tokio::sync::OnceCell \u306b\u3088\u3063\u3066\u4e00\u5ea6\u3060\u3051\u5b9f\u884c\u3059\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/ webapp\/infrastructure\/src\/repository.rs<\/span>\r\n<span class=\"c1\">\/\/ \u30c6\u30b9\u30c8\u7528\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u306e\u5b9a\u7fa9<\/span>\r\n<span class=\"nd\">#[cfg(test)]<\/span>\r\n<span class=\"k\">pub<\/span> <span class=\"k\">mod<\/span> <span class=\"n\">test_util<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"k\">use<\/span> <span class=\"nn\">std<\/span><span class=\"p\">::{<\/span><span class=\"nn\">process<\/span><span class=\"p\">::<\/span><span class=\"n\">Command<\/span><span class=\"p\">,<\/span> <span class=\"nn\">sync<\/span><span class=\"p\">::<\/span><span class=\"n\">Once<\/span><span class=\"p\">};<\/span>\r\n\r\n    <span class=\"k\">static<\/span> <span class=\"n\">ONCE<\/span><span class=\"p\">:<\/span> <span class=\"n\">OnceCell<\/span><span class=\"o\">&lt;<\/span><span class=\"p\">()<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">OnceCell<\/span><span class=\"p\">::<\/span><span class=\"nf\">const_new<\/span><span class=\"p\">();<\/span>\r\n\r\n    <span class=\"c1\">\/\/ \u521d\u671f\u5316\u51e6\u7406(OnceCell\u30671\u5ea6\u3060\u3051\u5b9f\u884c\u3059\u308b)<\/span>\r\n    <span class=\"k\">pub<\/span> <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">init_db<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">ONCE<\/span><span class=\"nf\">.get_or_init<\/span><span class=\"p\">(<\/span><span class=\"n\">init_seed_data<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/ \u521d\u671f\u5316\u51e6\u7406\u306e\u5b9f\u614b<\/span>\r\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">init_seed_data<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"c1\">\/\/ \u8272\u3005\u521d\u671f\u5316\u3092\u884c\u3046<\/span>\r\n        <span class=\"nf\">dotenv<\/span><span class=\"p\">()<\/span><span class=\"nf\">.ok<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"nf\">setup_logger<\/span><span class=\"p\">()<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\r\n\r\n        <span class=\"c1\">\/\/ prisma\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c<\/span>\r\n        <span class=\"nn\">Command<\/span><span class=\"p\">::<\/span><span class=\"nf\">new<\/span><span class=\"p\">(<\/span><span class=\"s\">\"cargo\"<\/span><span class=\"p\">)<\/span>\r\n            <span class=\"nf\">.args<\/span><span class=\"p\">([<\/span>\r\n                <span class=\"s\">\"prisma\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">\"migrate\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">\"reset\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">\"--skip-seed\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">\"-f\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">\"--skip-generate\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">\"--schema\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">\"..\/database\/schema.prisma\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"p\">])<\/span>\r\n            <span class=\"nf\">.output<\/span><span class=\"p\">()<\/span>\r\n            <span class=\"nf\">.expect<\/span><span class=\"p\">(<\/span><span class=\"s\">\"failed to execute migration\"<\/span><span class=\"p\">);<\/span>\r\n\r\n        <span class=\"c1\">\/\/ \u30b7\u30fc\u30c9\u30c7\u30fc\u30bf\u306e\u6295\u5165<\/span>\r\n        <span class=\"k\">let<\/span> <span class=\"n\">url<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">String<\/span><span class=\"p\">::<\/span><span class=\"nf\">from<\/span><span class=\"p\">(<\/span><span class=\"s\">\"mysql:\/\/id:pw@localhost:3306\/schema\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"c1\">\/\/ database\/src\/lib.rs\u3067\u5b9a\u7fa9\u3057\u305f\u30b7\u30fc\u30c9\u30c7\u30fc\u30bf\u6295\u5165\u95a2\u6570\u3092\u547c\u3073\u51fa\u3059<\/span>\r\n        <span class=\"nf\">seed<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"n\">url<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">\/\/ \u5229\u7528\u5074<\/span>\r\n<span class=\"nd\">#[cfg(test)]<\/span>\r\n<span class=\"k\">mod<\/span> <span class=\"n\">test<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nd\">#[tokio::test]<\/span>\r\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">test_hoge<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"c1\">\/\/ db\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u51e6\u7406\u3092\u547c\u3073\u51fa\u3059<\/span>\r\n        <span class=\"nf\">init_db<\/span><span class=\"p\">()<\/span><span class=\"k\">.await<\/span><span class=\"p\">;<\/span>\r\n\r\n        <span class=\"c1\">\/\/ \u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u3092\u5b9f\u88c5\u3059\u308b<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u7d42\u308f\u308a\u306b<\/h2>\n<p>\u4ee5\u4e0a\u3001prisma-client-rust\u3092\u4f7f\u3063\u3066Typescript\u3092\u4f7f\u308f\u305a\u306bprisma\u3092Rust\u3067\u5229\u7528\u3059\u308b\u7d39\u4ecb\u3067\u3057\u305f\u3002<\/p>\n<p>\u6b21\u56de\u306e\u8a18\u4e8b\u306f @sho-kanamaru \u3055\u3093\u306e\u8a18\u4e8b\u3067\u3059\u3002(\u3053\u3061\u3089)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u308c\u306f\u682a\u5f0f\u4f1a\u793eLabBase \u30c6\u30c3\u30af\u30ab\u30ec\u30f3\u30c0\u30fc Advent Calendar 2022\u300116\u65e5\u76ee\u306e\u8a18\u4e8b\u3067\u3059\u3002 [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-44988","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>- Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:description\" content=\"\u3053\u308c\u306f\u682a\u5f0f\u4f1a\u793eLabBase \u30c6\u30c3\u30af\u30ab\u30ec\u30f3\u30c0\u30fc Advent Calendar 2022\u300116\u65e5\u76ee\u306e\u8a18\u4e8b\u3067\u3059\u3002 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-17T01:58:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T00:24:31+00:00\" \/>\n<meta name=\"author\" content=\"\u96c5, \u609f\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u96c5, \u609f\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/\",\"name\":\"- Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-04-17T01:58:54+00:00\",\"dateModified\":\"2024-05-04T00:24:31+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\",\"name\":\"\u96c5, \u609f\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"caption\":\"\u96c5, \u609f\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"- Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/","og_locale":"zh_CN","og_type":"article","og_description":"\u3053\u308c\u306f\u682a\u5f0f\u4f1a\u793eLabBase \u30c6\u30c3\u30af\u30ab\u30ec\u30f3\u30c0\u30fc Advent Calendar 2022\u300116\u65e5\u76ee\u306e\u8a18\u4e8b\u3067\u3059\u3002 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-04-17T01:58:54+00:00","article_modified_time":"2024-05-04T00:24:31+00:00","author":"\u96c5, \u609f","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u96c5, \u609f","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"4 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/","name":"- Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-04-17T01:58:54+00:00","dateModified":"2024-05-04T00:24:31+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/"]}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6","name":"\u96c5, \u609f","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","caption":"\u96c5, \u609f"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/44988-2\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/44988","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=44988"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/44988\/revisions"}],"predecessor-version":[{"id":97219,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/44988\/revisions\/97219"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=44988"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=44988"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=44988"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}