[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-build-rust-rest-api-actix-sqlx-postgres-zh":3,"article-related-build-rust-rest-api-actix-sqlx-postgres-zh":28,"series-tools-497d44c4-928e-4682-a8bf-be8fe8a27934":86},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":11,"views":25,"created_at":26,"published_at":27,"topic_cluster_id":11},"497d44c4-928e-4682-a8bf-be8fe8a27934","build-rust-rest-api-actix-sqlx-postgres-zh","用 Actix、SQLx、Postgres 做 Rust …","\u003Cp>Rust 後端圈子很愛同一套組合。\u003Ca href=\"https:\u002F\u002Factix.rs\u002F\" target=\"_blank\" rel=\"noopener\">Actix Web\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flaunchbadge\u002Fsqlx\" target=\"_blank\" rel=\"noopener\">SQLx\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fwww.postgresql.org\u002F\" target=\"_blank\" rel=\"noopener\">PostgreSQL\u003C\u002Fa>，幾乎是固定班底。說真的，這套不是靠話題撐起來的。\u003C\u002Fp>\u003Cp>它受歡迎，原因很直接。Actix 給你 async handler。SQLx 幫你抓 SQL 錯誤。Postgres 能扛真實流量。這三個放一起，很多團隊就能少走冤枉路。\u003C\u002Fp>\u003Cp>這篇整理的是 Marcus Chen 的教學脈絡。Prism News 這週也提到它。重點很簡單：你要做 production API，別先想花俏架構。先把連線池、migration、錯誤處理弄穩。\u003C\u002Fp>\u003Ch2>為什麼這套組合常被選\u003C\u002Fh2>\u003Cp>先講 web frame\u003Ca href=\"\u002Fnews\u002Fwhat-agentic-workflows-actually-do-enterprise-ai-zh\">work\u003C\u002Fa>。Actix Web 4 在 Rust 世界裡，還是很常被拿來當基準。另一個常見對手是 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Faxum\" target=\"_blank\" rel=\"noopener\">Axum\u003C\u002Fa>。Axum 跟 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftokio-rs\u002Ftower\" target=\"_blank\" rel=\"noopener\">Tower\u003C\u002Fa> 生態綁得很深。你如果團隊已經熟 Tokio middleware，Axum 會很順。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775153217068-jg3y.png\" alt=\"用 Actix、SQLx、Postgres 做 Rust …\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>但 Actix 的優勢也很明顯。它上線案例多。文件和範例也多。很多人不是想重新設計一套框架，只是想快點把 API 送進 production。這時候，成熟度很重要。\u003C\u002Fp>\u003Cp>別只看 benchmark。後端團隊不是在交測試報告。你是要處理爛 request、慢 query，還有半夜才爆的依賴問題。這時候，少一點驚喜，比多 5% throughput 更實在。\u003C\u002Fp>\u003Cp>SQLx 的做法也很討喜。它不把 SQL 包成一堆 ORM 魔法。你還是寫原生 SQL。差別在於，它會在編譯期檢查 query 和 schema。這對 Rust 團隊來說很爽，因為很多錯誤可以在部署前就被抓到。\u003C\u002Fp>\u003Cul>\u003Cli>Actix Web 4：HTTP 層主角。\u003C\u002Fli>\u003Cli>Axum：偏 Tower 生態。\u003C\u002Fli>\u003Cli>SQLx：保留原生 SQL，還做編譯期檢查。\u003C\u002Fli>\u003Cli>PostgreSQL：比 SQLite 更適合多 worker 與連線池。\u003C\u002Fli>\u003C\u002Ful>\u003Cp>PostgreSQL 這邊幾乎沒什麼爭議。SQLite 很適合本機工具、小型專案、單機應用。可是一旦你要連線池、同步多工、migration 版本控管，Postgres 就比較乾脆。你本機就用 Postgres，部署時通常只是在換環境，不是重做架構。\u003C\u002Fp>\u003Ch2>專案怎麼起手才不會亂\u003C\u002Fh2>\u003Cp>這類教學最有價值的地方，常常不是程式碼本身，而是專案骨架。\u003Ccode>Cargo.toml\u003C\u002Fcode> 通常會放 \u003Ccode>actix-web\u003C\u002Fcode>、\u003Ccode>sqlx\u003C\u002Fcode>，再開 \u003Ccode>postgres\u003C\u002Fcode>、\u003Ccode>runtime-tokio\u003C\u002Fcode>、\u003Ccode>macros\u003C\u002Fcode>。另外還會有 \u003Ccode>serde\u003C\u002Fcode>、\u003Ccode>dotenvy\u003C\u002Fcode>、\u003Ccode>tracing\u003C\u002Fcode>、\u003Ccode>tracing-subscriber\u003C\u002Fcode>。工具面則少不了 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flaunchbadge\u002Fsqlx\u002Fblob\u002Fmain\u002Fsqlx-cli\u002FREADME.md\" target=\"_blank\" rel=\"noopener\">sqlx-cli\u003C\u002Fa>。\u003C\u002Fp>\u003Cp>很多人第一次踩雷，都踩在 runtime。Actix 跑在 Tokio 上。這件事看起來很基本，但不同 crate 對 Tokio 版本或 runtime 的假設，常常會害你在測試時沒事，上線後才出包。這種問題最煩，因為它不會在編譯期直接炸給你看。\u003C\u002Fp>\u003Cp>另一個很值得早點做的是 logging。\u003Ca href=\"https:\u002F\u002Fdocs.rs\u002Ftracing\u002Flatest\u002Ftracing\u002F\" target=\"_blank\" rel=\"noopener\">tracing\u003C\u002Fa> 這套很適合 REST API。你可以把 request ID、span、query 時間都串起來。出了問題，不用靠猜。直接看 log 就知道卡在哪裡。\u003C\u002Fp>\u003Cp>如果你是台灣團隊，我會建議一開始就把環境變數、migration、測試資料庫一起規劃。不要先寫 handler，後面才補。那樣很容易把技術債塞進第一版。\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ccode>#[actix_web::main]\u003C\u002Fcode> 會啟動 Tokio runtime。\u003C\u002Fli>\u003Cli>\u003Ccode>web::Data\u003C\u002Fcode> 很適合放共享狀態。\u003C\u002Fli>\u003Cli>\u003Ccode>web::Json\u003C\u002Fcode>、\u003Ccode>web::Path\u003C\u002Fcode>、\u003Ccode>web::Query\u003C\u002Fcode> 負責解析輸入。\u003C\u002Fli>\u003Cli>\u003Ccode>sqlx migrate\u003C\u002Fcode> 與 \u003Ccode>cargo sqlx prepare\u003C\u002Fcode> 應該進流程。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>最容易被忽略的細節\u003C\u002Fh2>\u003Cp>Marcus Chen 的教學最有料的地方，是他沒有只講 hello world。真正上線時，最先出事的常常是連線池。這東西看起來很無聊，但它直接決定 latency。池太小，request 會排隊。池太大，Postgres 自己先喘不過氣。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775153235517-7da7.png\" alt=\"用 Actix、SQLx、Postgres 做 Rust …\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>所以「一個 worker 配兩條連線」只能當起點。你還是要看 CPU 核心數、Postgres 的 \u003Ccode>max_connections\u003C\u002Fcode>，還有 query 平均耗時。講白了，這沒有標準答案。要靠實測。\u003C\u002Fp>\u003Cblockquote>“Building production-grade APIs in Rust has never been more accessible.” — Marcus Chen\u003C\u002Fblockquote>\u003Cp>這句話我覺得算準。因為這套組合真的把很多麻煩縮小了。SQLx 幫你抓 schema 問題。Actix 把 typed extraction 做得很順。Postgres 則提供穩定的交易和併發模型。\u003C\u002Fp>\u003Cp>但別誤會，這不代表沒坑。migration 就是一個。SQLx 的 timestamp migration 很好管理，可是如果你忘了更新 offline query cache，CI 可能直接掛掉。尤其是沒連 live database 的 pipeline，更要把 \u003Ccode>.sqlx\u003C\u002Fcode> 目錄納入版本控管。\u003C\u002Fp>\u003Cp>另一個常見問題是錯誤映射。很多人會在 handler 裡面亂丟狀態碼。這樣 API 一多，維護就會很痛。比較好的做法，是把資料庫錯誤集中轉成一個 \u003Ccode>ResponseError\u003C\u002Fcode> enum。\u003C\u002Fp>\u003Ch2>數字怎麼看才不會被帶風向\u003C\u002Fh2>\u003Cp>如果只看效能，Actix Web 常被拿來跟 Axum 比。教學裡提到，在高負載下，Actix 的 requests per second 大約高 10% 到 15%。這是真的有差，但對 CRUD API 來說，通常不是決勝點。\u003C\u002Fp>\u003Cp>更有感的是部署成本。Rust 的 multistage Docker build，常常可以把 runtime image 壓到 20 到 50 MB。這比很多 JVM 服務小很多，也通常比 Python 服務乾淨。映像檔小，推版快，回滾也比較不痛。\u003C\u002Fp>\u003Cp>資料庫選型也可以拿來比。SQLx 跟 Diesel 是兩種路線。Diesel 的型別系統很硬，但動態 query 會很卡。SQLx 則保留原生 SQL，async 也比較自然。等你的 API 開始有可選 filter、join、排序時，你會更懂這差別。\u003C\u002Fp>\u003Cul>\u003Cli>Actix Web 對 Axum：高負載下約快 10% 到 15%。\u003C\u002Fli>\u003Cli>Rust Docker runtime image：常見 20 到 50 MB。\u003C\u002Fli>\u003Cli>SQLx 對 Diesel：SQLx 偏原生 SQL，Diesel 偏型別建構。\u003C\u002Fli>\u003Cli>PostgreSQL 對 SQLite：Postgres 更適合多 worker 與併發寫入。\u003C\u002Fli>\u003C\u002Ful>\u003Cp>測試這塊也不能省。你可以用 Dockerized Postgres 做 integration test。再搭配 \u003Ccode>sqlx::test\u003C\u002Fcode> macro。這樣很多 schema 問題、交易問題、SQL 語法問題，都能提早抓到。\u003C\u002Fp>\u003Cp>CI 方面，GitHub Actions 加一個 Postgres service container 就夠用了。不用一開始就搞很重的\u003Ca href=\"\u002Fnews\u002Fopenai-122b-ai-infrastructure-push-zh\">基礎設施\u003C\u002Fa>。先讓 build 誠實，再談優化。\u003C\u002Fp>\u003Ch2>這套組合放在產業裡的位置\u003C\u002Fh2>\u003Cp>Rust 後端這幾年慢慢進入更實際的場景。不是每家公司都要用 Rust。這點要講白。可是如果你的服務很在意 latency、記憶體用量、資料一致性，Rust 就很有吸引力。\u003C\u002Fp>\u003Cp>Actix、SQLx、Postgres 這套組合，剛好把三件事接好。HTTP 層、資料層、資料庫層，都有成熟工具。你不用自己拼一堆輪子，也不用把 SQL 藏進一個很厚的 ORM。\u003C\u002Fp>\u003Cp>這也是為什麼很多團隊會把它當正式後端，而不是實驗品。你可以先做內部 API，再慢慢擴到對外服務。路徑很清楚。風險也比較可控。\u003C\u002Fp>\u003Cp>如果你是從 N\u003Ca href=\"\u002Fnews\u002Fvs-code-cursor-windsurf-jetbrains-web-ides-2026-zh\">ode\u003C\u002Fa>、Python 或 Go 轉過來，最需要適應的不是語法，而是思考方式。Rust 會逼你把資料流、錯誤流、生命週期想清楚。剛開始會覺得煩。可是一旦你把框架搭穩，後面就很少有那種「怎麼又炸了」的驚喜。\u003C\u002Fp>\u003Ch2>我會怎麼下結論\u003C\u002Fh2>\u003Cp>如果是我這週要開新 API，我會直接用這套。HTTP 層選 Actix Web。資料層用 SQLx。資料庫選 PostgreSQL。第一天就把 migration、log、測試資料庫放進流程。不要等到第二版才補。\u003C\u002Fp>\u003Cp>我也會把錯誤處理集中管理。別在每個 handler 裡各寫各的。那樣 API 一多，維護會很痛。還有，別把 async 想得太神。async 只是把問題搬到別的地方。連線池、runtime、schema 一樣要管。\u003C\u002Fp>\u003Cp>我的預測很簡單。接下來會有更多 Rust 團隊，直接把 Actix、SQLx、Postgres 當標配。不是因為它最潮。是因為它夠直白，也夠能打。你如果現在在選 backend stack，我會先問一個問題：你想讓 compiler 先抓錯，還是想讓半夜的 pager 幫你抓？\u003C\u002Fp>","Rust 後端常見組合是 \u003Ca href=\"https:\u002F\u002Factix.rs\u002F\" target=\"_blank\" rel=\"noopener\">Actix Web\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flaunchbadge\u002Fsqlx\" target=\"_blank\" rel=\"noopener\">SQLx\u003C\u002Fa> 和 \u003Ca href=\"https:\u002F\u002Fwww.postgresql.org\u002F\" target=\"_blank\" rel=\"noopener\">PostgreSQL\u003C\u002Fa>。這套組合主打 async、編譯期 SQL 檢查，還有小體積 Docker 映像，適合直接上線。","www.prismnews.com","https:\u002F\u002Fwww.prismnews.com\u002Fhobbies\u002Frust-programming\u002Fbuild-a-rest-api-with-actix-web-sqlx-and-postgresql-in-rust",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775153217068-jg3y.png","tools","zh","90605034-906b-46b7-a7ff-db3d3b4add1b",[17,18,19,20,21,22,23,24],"Rust","Actix Web","SQLx","PostgreSQL","REST API","Tokio","tracing","Docker",6,"2026-04-02T18:06:39.618436+00:00","2026-04-02T18:06:39.453+00:00",{"tags":29,"relatedLang":45,"relatedPosts":49},[30,32,33,35,37,39,41,43],{"name":17,"slug":31},"rust",{"name":23,"slug":23},{"name":21,"slug":34},"rest-api",{"name":19,"slug":36},"sqlx",{"name":18,"slug":38},"actix-web",{"name":20,"slug":40},"postgresql",{"name":22,"slug":42},"tokio",{"name":24,"slug":44},"docker",{"id":15,"slug":46,"title":47,"language":48},"build-rust-rest-api-actix-sqlx-postgres-en","Build a Rust REST API with Actix, SQLx, Postgres","en",[50,56,62,68,74,80],{"id":51,"slug":52,"title":53,"cover_image":54,"image_url":54,"created_at":55,"category":13},"1a92ac0a-75ea-4877-874d-4a309cd0085b","nvidia-research-gpu-template-zh","NVIDIA 研究頁把 GPU 資源變模板","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780567412863-e8oq.png","2026-06-04T10:02:58.043845+00:00",{"id":57,"slug":58,"title":59,"cover_image":60,"image_url":60,"created_at":61,"category":13},"3ead09ec-5656-4165-9bb0-f602add3c409","qdrant-filter-first-rag-design-decoded-zh","Qdrant 讓 RAG 先過濾再找相似","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780566519640-bdds.png","2026-06-04T09:47:59.450347+00:00",{"id":63,"slug":64,"title":65,"cover_image":66,"image_url":66,"created_at":67,"category":13},"7b5e6965-307e-4492-bf65-d922cd7818ad","anthropic-code-review-tool-ai-generated-code-zh","Anthropic 讓 AI 程式變可審","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780563813320-5wc7.png","2026-06-04T09:02:56.999212+00:00",{"id":69,"slug":70,"title":71,"cover_image":72,"image_url":72,"created_at":73,"category":13},"bef47dbc-b0b4-439e-bae9-abe9473a321c","wei-shen-me-tether-ba-ben-di-ai-ji-yi-tui-jin-ri-chang-zhuan-zh","為什麼 Tether 把本地 AI 記憶推進日常裝置是對的","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780542170805-opi6.png","2026-06-04T03:02:19.599329+00:00",{"id":75,"slug":76,"title":77,"cover_image":78,"image_url":78,"created_at":79,"category":13},"d3ec03a8-a805-4a21-9826-72a74a72b625","databricks-model-serving-llm-deploy-guide-zh","Databricks Model Serving 讓 LLM 部署變簡單","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780525998117-7ur8.png","2026-06-03T22:32:51.005996+00:00",{"id":81,"slug":82,"title":83,"cover_image":84,"image_url":84,"created_at":85,"category":13},"4dd225a8-bf6c-4768-a486-a27956c7033d","opencode-digitalocean-model-freedom-zh","OpenCode+DigitalOcean 讓你切換模型","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780525116428-1q7g.png","2026-06-03T22:18:06.969758+00:00",[87,92,97,102,107,112,117,122,127,132],{"id":88,"slug":89,"title":90,"created_at":91},"855cd52f-6fab-46cc-a7c1-42195e8a0de4","surepath-real-time-mcp-policy-controls-zh","SurePath 推出即時 MCP 政策控管","2026-03-26T07:57:40.77233+00:00",{"id":93,"slug":94,"title":95,"created_at":96},"9b19ab54-edef-4dbd-9ce4-a51e4bae4ebb","mcp-in-2026-the-ai-tool-layer-teams-use-zh","2026 年 MCP：團隊真的在用的 AI 工具層","2026-03-26T08:01:46.589694+00:00",{"id":98,"slug":99,"title":100,"created_at":101},"af9c46c3-7a28-410b-9f04-32b3de30a68c","prompting-in-2026-what-actually-works-zh","2026 提示工程，真正有用的是什麼","2026-03-26T08:08:12.453028+00:00",{"id":103,"slug":104,"title":105,"created_at":106},"05553086-6ed0-4758-81fd-6cab24b575e0","garry-tan-open-sources-claude-code-toolkit-zh","Garry Tan 開源 Claude Code 工具包","2026-03-26T08:26:20.068737+00:00",{"id":108,"slug":109,"title":110,"created_at":111},"042a73a2-18a2-433d-9e8f-9802b9559aac","github-ai-projects-to-watch-in-2026-zh","2026 必看 20 個 GitHub AI 專案","2026-03-26T08:28:09.619964+00:00",{"id":113,"slug":114,"title":115,"created_at":116},"a5f94120-ac0d-4483-9a8b-63590071ac6a","claude-code-vs-cursor-2026-zh","Claude Code 與 Cursor 深度對比：202…","2026-03-26T13:27:14.279193+00:00",{"id":118,"slug":119,"title":120,"created_at":121},"0975afa1-e0c7-4130-a20d-d890eaed995e","practical-github-guide-learning-ml-2026-zh","2026 機器學習入門 GitHub 實用指南","2026-03-27T01:16:49.712576+00:00",{"id":123,"slug":124,"title":125,"created_at":126},"bfdb467a-290f-4a80-b3a9-6f081afb6dff","aiml-2026-student-ai-ml-lab-repo-review-zh","AIML-2026：像課綱的學生實驗 Repo","2026-03-27T01:21:51.467798+00:00",{"id":128,"slug":129,"title":130,"created_at":131},"80cabc3e-09fc-4ff5-8f07-b8d68f5ae545","ai-trending-github-repos-and-research-feeds-zh","AI Trending：把 AI 資源收成一張表","2026-03-27T01:31:35.262183+00:00",{"id":133,"slug":134,"title":135,"created_at":136},"3ce6e6e2-bac5-463e-9f8d-45caabcc61f7","awesome-ai-for-science-research-tools-map-zh","AI 科研工具清單，開始像地圖了","2026-03-27T01:46:50.521945+00:00"]