{"id":7790,"date":"2023-02-22T19:41:25","date_gmt":"2023-02-22T16:11:25","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/type-safe-s3-select-queries-with-kysely-4ge0\/"},"modified":"2023-02-22T19:41:25","modified_gmt":"2023-02-22T16:11:25","slug":"type-safe-s3-select-queries-with-kysely-4ge0","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/type-safe-s3-select-queries-with-kysely-4ge0\/","title":{"rendered":"Type-safe S3 \u067e\u0631\u0633 \u0648 \u062c\u0648\u0647\u0627 \u0631\u0627 \u0628\u0627 Kysely \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f"},"content":{"rendered":"<div data-article-id=\"1360937\" id=\"article-body\">\n<p>S3 Select \u06cc\u06a9 \u0648\u06cc\u0698\u06af\u06cc Amazon S3 \u0627\u0633\u062a \u06a9\u0647 \u0627\u0645\u06a9\u0627\u0646 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0632\u06cc\u0631\u0645\u062c\u0645\u0648\u0639\u0647 \u0647\u0627\u06cc \u0645\u062d\u062a\u0648\u0627\u06cc S3 Objects \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0639\u0628\u0627\u0631\u0627\u062a SQL \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f.  \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0628\u0646\u062f\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f SELECT \u0648 WHERE \u0628\u0631\u0627\u06cc \u0648\u0627\u06a9\u0634\u06cc \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0627\u0632 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc CSV\u060c JSON \u06cc\u0627 Apache Parquet \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u060c \u062d\u062a\u06cc \u0627\u06af\u0631 \u0628\u0627 GZIP \u0648\/\u06cc\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u062f\u0631 \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u0641\u0634\u0631\u062f\u0647 \u0634\u062f\u0647 \u0628\u0627\u0634\u0646\u062f.<\/p>\n<p>S3 Select \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0633\u0627\u062f\u0647\u060c \u0645\u0642\u0631\u0648\u0646 \u0628\u0647 \u0635\u0631\u0641\u0647 \u0627\u0633\u062a \u0648 \u0628\u0633\u062a\u0647 \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0647 \u0634\u062f\u062a \u0628\u0647\u0628\u0648\u062f \u0628\u062e\u0634\u062f.  \u0628\u0647 \u0637\u0648\u0631 \u06a9\u0644\u06cc \u06cc\u06a9 \u0627\u0641\u0632\u0648\u062f\u0646\u06cc \u0639\u0627\u0644\u06cc \u0628\u0647 \u062c\u0639\u0628\u0647 \u0627\u0628\u0632\u0627\u0631 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0628\u062f\u0648\u0646 \u0633\u0631\u0648\u0631 \u0627\u0633\u062a\u060c \u0628\u0647 \u0648\u06cc\u0698\u0647 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647:<\/p>\n<ul>\n<li>\u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0628\u0647 \u062d\u062c\u0645 \u0632\u06cc\u0627\u062f\u06cc \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627 \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f (\u06a9\u0647 \u0622\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0631\u0627\u0647 \u062d\u0644 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u062f\u06cc\u06af\u0631 \u0645\u0627\u0646\u0646\u062f DynamoDB \u0646\u0627\u0645\u0646\u0627\u0633\u0628 \u0645\u06cc \u06a9\u0646\u062f)<\/li>\n<li>\u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0634\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647 \u0648\/\u06cc\u0627 \u067e\u0648\u06cc\u0627 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0648 \u0641\u06cc\u0644\u062a\u0631 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0634\u0645\u0627 \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0628\u0646\u062f JOIN \u0646\u062f\u0627\u0631\u06cc\u062f (\u0632\u06cc\u0631\u0627 S3 Select \u0641\u0642\u0637 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u06a9\u0646\u062f) \u06cc\u0627 \u0628\u0631\u0627\u06cc \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u06cc\u06a9 \u0631\u06a9\u0648\u0631\u062f \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627 (\u0628\u0647 \u0622\u0646 S3 Select \u0645\u06cc \u06af\u0648\u06cc\u0646\u062f \u0646\u0647 S3 Insert \ud83d\ude42)<\/li>\n<\/ul>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\u060c \u0646\u062d\u0648\u0647 \u0627\u062c\u0631\u0627\u06cc \u062f\u0633\u062a\u0648\u0631\u0627\u062a S3 Select \u062f\u0631 \u062a\u0627\u06cc\u067e \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0631\u0627 \u06cc\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u0645 \u06af\u0631\u0641\u062a \u0648 \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 DevX \u0648 \u0627\u06cc\u0645\u0646\u06cc \u0646\u0648\u0639 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Kysely \u0628\u0647\u0628\u0648\u062f \u062f\u0647\u06cc\u0645.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/type-safe-s3-select-queries-with-kysely-4ge0\/#%D9%BE%D8%B1%D8%B3_%D9%88_%D8%AC%D9%88_%D8%A8%D8%A7_S3_Select\" >\u067e\u0631\u0633 \u0648 \u062c\u0648 \u0628\u0627 S3 Select<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/type-safe-s3-select-queries-with-kysely-4ge0\/#%D8%AA%D8%AC%D8%B2%DB%8C%D9%87_%D9%BE%D8%A7%D8%B3%D8%AE_%D9%BE%D8%B1%D8%B3_%D9%88_%D8%AC%D9%88\" >\u062a\u062c\u0632\u06cc\u0647 \u067e\u0627\u0633\u062e \u067e\u0631\u0633 \u0648 \u062c\u0648<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/type-safe-s3-select-queries-with-kysely-4ge0\/#%D8%B3%D8%A7%D8%AE%D8%AA_%D9%BE%D8%B1%D8%B3_%D9%88_%D8%AC%D9%88_%D8%A8%D8%A7_Kysely\" >\u0633\u0627\u062e\u062a \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0628\u0627 Kysely<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/type-safe-s3-select-queries-with-kysely-4ge0\/#%D8%A7%D8%B3%D8%AA%D9%86%D8%A8%D8%A7%D8%B7_%D9%86%D9%88%D8%B9_%D9%BE%D8%A7%D8%B3%D8%AE\" >\u0627\u0633\u062a\u0646\u0628\u0627\u0637 \u0646\u0648\u0639 \u067e\u0627\u0633\u062e<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/type-safe-s3-select-queries-with-kysely-4ge0\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87\" >\u0646\u062a\u06cc\u062c\u0647<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%D8%B1%D8%B3_%D9%88_%D8%AC%D9%88_%D8%A8%D8%A7_S3_Select\"><\/span>\n<p>  \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0628\u0627 S3 Select<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u06af\u0648\u06cc\u06cc\u0645 \u06a9\u0647 \u0645\u0627 \u06cc\u06a9 DB \u0627\u0632 \u067e\u0648\u06a9\u0645\u0648\u0646 \u0647\u0627 \u0628\u0647 \u0634\u06a9\u0644 CSV \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u062f\u0631 \u062c\u0627\u06cc\u06cc \u062f\u0631 \u06cc\u06a9 \u0633\u0637\u0644 S3 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>id ; name      ; customName ; type     ; level ; generation\n1  ; pikachu   ;            ; electric ; 42    ; 1\n2  ; charizard ;            ; fire     ; 54    ; 1\n3  ; meganium  ; plantyDino ; grass    ; 26    ; 2\n...\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06af\u0631 \u0628\u062e\u0648\u0627\u0647\u06cc\u0645 \u067e\u0648\u06a9\u0645\u0648\u0646 \u0647\u0627\u06cc \u0622\u062a\u0634 \u0631\u0627 \u0627\u0632 \u0646\u0633\u0644 1 \u0648 2 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u0645 \u0686\u0647\u061f  \u062e\u0648\u0628\u060c S3 Select \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0627 \u06a9\u0648\u0626\u0631\u06cc \u0632\u06cc\u0631 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">S3Client<\/span><span class=\"p\">,<\/span> <span class=\"nx\">SelectObjectContentCommand<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@aws-sdk\/client-s3<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">s3Client<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">S3Client<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">region<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">us-east-1<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ &lt;= Your region here<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Payload<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">s3Client<\/span><span class=\"p\">.<\/span><span class=\"nx\">send<\/span><span class=\"p\">(<\/span>\n  <span class=\"k\">new<\/span> <span class=\"nx\">SelectObjectContentCommand<\/span><span class=\"p\">({<\/span>\n    <span class=\"c1\">\/\/ \ud83d\udc47 Those first params are required but don't mind them<\/span>\n    <span class=\"na\">ExpressionType<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">SQL<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">OutputSerialization<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">JSON<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">RecordDelimiter<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">,<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"c1\">\/\/ \ud83d\udc47 Those depends on the CSV<\/span>\n    <span class=\"na\">InputSerialization<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">CSV<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">FileHeaderInfo<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">USE<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">FieldDelimiter<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">;<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">QuoteCharacter<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\"<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"c1\">\/\/ \ud83d\udc47 Those are the most important<\/span>\n    <span class=\"na\">Bucket<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">my-super-bucket-name<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">Key<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">pokedex.csv<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">Expression<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`\n            select \"id\", \"name\", \"customName\", \"type\" as \"pokemonType\", \"level\"\n                from \"S3Object\"\n                where\n                    \"generation\" in ('1', '2')\n                    and \"type\" = 'fire'\n      `<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">}),<\/span>\n<span class=\"p\">);<\/span>\n\n<span class=\"c1\">\/\/ Note that this command requires the s3:GetObject permission<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u0639\u0627\u0644\u06cc \u0627\u0633\u062a \u0648 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0628\u0647 \u062c\u0632 \u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0622\u0646 \u0631\u0627 \u0628\u0647\u062a\u0631 \u06a9\u0646\u06cc\u0645:<\/p>\n<ul>\n<li>\ud83d\udcdd \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u067e\u0627\u0633\u062e \u0628\u0627\u06cc\u062f \u0645\u0642\u062f\u0627\u0631\u06cc \u062a\u062c\u0632\u06cc\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 <code>Payload<\/code>\n<\/li>\n<li>\ud83d\udc4d \u0645\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u0632 Kysely \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0639\u0628\u0627\u0631\u062a SQL \u0628\u0647 \u0631\u0648\u0634\u06cc \u0627\u06cc\u0645\u0646 \u0648 \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 devX \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645<\/li>\n<li>\ud83c\udf08 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u0632 \u0622\u0646 \u0628\u0631\u0627\u06cc \u062a\u0627\u06cc\u067e \u0646\u062a\u06cc\u062c\u0647 \u062f\u0633\u062a\u0648\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AA%D8%AC%D8%B2%DB%8C%D9%87_%D9%BE%D8%A7%D8%B3%D8%AE_%D9%BE%D8%B1%D8%B3_%D9%88_%D8%AC%D9%88\"><\/span>\n<p>  \u062a\u062c\u0632\u06cc\u0647 \u067e\u0627\u0633\u062e \u067e\u0631\u0633 \u0648 \u062c\u0648<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 <code>Payload<\/code> \u06cc\u06a9 \u0634\u06cc \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0633\u0627\u062f\u0647 \u0646\u06cc\u0633\u062a \u0628\u0644\u06a9\u0647 \u0646\u0645\u0648\u0646\u0647 \u0627\u06cc \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a <code>AsyncInterable<\/code>.  \u062d\u0627\u0644\u0627 \u0686\u0647 \u062c\u0647\u0646\u0645\u06cc \u0627\u0633\u062a <code>AsyncIterable<\/code> \u0634\u0645\u0627 \u0627\u0632 \u0645\u0646 \u0628\u067e\u0631\u0633\u06cc\u062f\u061f  \u062e\u0648\u0628\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u0627\u0633\u0646\u0627\u062f \u0631\u0633\u0645\u06cc Async Iterator \u062f\u0631 MDN \u0628\u06af\u0631\u062f\u06cc\u062f \u06cc\u0627 \u0641\u0642\u0637 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u067e\u0631\u0633\u06cc\u062f\u0646 \u0633\u0624\u0627\u0644 \u062e\u0648\u062f\u062f\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u0627\u0632 \u0631\u0627\u0647\u0646\u0645\u0627 \u0632\u06cc\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">SelectObjectContentEventStream<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@aws-sdk\/client-s3<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"c1\">\/\/ \ud83d\udc47 TextDecoder is a native Node\/Browser class<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">textDecoder<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">TextDecoder<\/span><span class=\"p\">();<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">parseS3SelectEventStream<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span>\n  <span class=\"nx\">s3SelectEventStream<\/span><span class=\"p\">:<\/span>\n    <span class=\"o\">|<\/span> <span class=\"nx\">AsyncIterable<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">SelectObjectContentEventStream<\/span><span class=\"o\">&gt;<\/span>\n    <span class=\"o\">|<\/span> <span class=\"kc\">undefined<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">unknown<\/span><span class=\"p\">[]<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">s3SelectEventStream<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"p\">[];<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"na\">stringifiedJSONOutputs<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">[]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[];<\/span>\n\n  <span class=\"k\">for<\/span> <span class=\"k\">await<\/span> <span class=\"p\">(<\/span><span class=\"kd\">const<\/span> <span class=\"nx\">event<\/span> <span class=\"k\">of<\/span> <span class=\"nx\">s3SelectEventStream<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">Records<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">stringifiedJSONOutput<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">textDecoder<\/span><span class=\"p\">.<\/span><span class=\"nx\">decode<\/span><span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">Records<\/span><span class=\"p\">.<\/span><span class=\"nx\">Payload<\/span><span class=\"p\">);<\/span>\n      <span class=\"nx\">stringifiedJSONOutputs<\/span><span class=\"p\">.<\/span><span class=\"nx\">push<\/span><span class=\"p\">(<\/span><span class=\"nx\">stringifiedJSONOutput<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">rows<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nx\">parse<\/span><span class=\"p\">(<\/span>\n    <span class=\"dl\">'<\/span><span class=\"s1\">[<\/span><span class=\"dl\">'<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">stringifiedJSONOutputs<\/span><span class=\"p\">.<\/span><span class=\"nx\">join<\/span><span class=\"p\">(<\/span><span class=\"dl\">''<\/span><span class=\"p\">).<\/span><span class=\"nx\">slice<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">]<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">)<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">unknown<\/span><span class=\"p\">[];<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"nx\">rows<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062d\u0627\u0644\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u062e\u0631\u0648\u062c\u06cc \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u062a\u062c\u0632\u06cc\u0647 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"na\">Payload<\/span><span class=\"p\">:<\/span> <span class=\"nx\">s3SelectEventStream<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">s3Client<\/span><span class=\"p\">.<\/span><span class=\"nx\">send<\/span><span class=\"p\">(<\/span>\n  <span class=\"k\">new<\/span> <span class=\"nx\">SelectObjectContentCommand<\/span><span class=\"p\">({<\/span>\n    <span class=\"c1\">\/\/ ...<\/span>\n  <span class=\"p\">}),<\/span>\n<span class=\"p\">);<\/span>\n\n<span class=\"c1\">\/\/ \ud83c\udf89 Ta-da!<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">myPokemons<\/span><span class=\"p\">:<\/span> <span class=\"nx\">unknown<\/span><span class=\"p\">[]<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">parseS3SelectEventStream<\/span><span class=\"p\">(<\/span>\n  <span class=\"nx\">s3SelectEventStream<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">);<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B3%D8%A7%D8%AE%D8%AA_%D9%BE%D8%B1%D8%B3_%D9%88_%D8%AC%D9%88_%D8%A8%D8%A7_Kysely\"><\/span>\n<p>  \u0633\u0627\u062e\u062a \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0628\u0627 Kysely<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u0622\u0646 \u0631\u0648\u0628\u0631\u0648 \u0634\u0648\u06cc\u0645\u060c \u0646\u0648\u0634\u062a\u0646 \u067e\u0631\u0633 \u0648 \u062c\u0648\u0647\u0627\u06cc SQL \u0628\u0627 \u062f\u0633\u062a \u062f\u0631\u062f\u0646\u0627\u06a9 \u0648 \u0645\u0633\u062a\u0639\u062f \u062e\u0637\u0627 \u0627\u0633\u062a.  \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0627\u06af\u0631 CSV \u0646\u0627\u06af\u0647\u0627\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u0634\u06a9\u0644 \u062f\u0647\u062f\u060c \u062e\u0648\u0628 \u0646\u06cc\u0633\u062a \u06a9\u0647 \u06cc\u06a9 \u062e\u0637\u0627\u06cc \u0646\u0648\u0639 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645\u061f<\/p>\n<p>\u0627\u06cc\u0646\u062c\u0627\u0633\u062a \u06a9\u0647 Kysely \u0628\u0647 \u06a9\u0645\u06a9 \u0645\u06cc \u0622\u06cc\u062f: Kysely \u06cc\u06a9 \u0633\u0627\u0632\u0646\u062f\u0647 \u067e\u0631\u0633 \u0648 \u062c\u0648\u06cc SQL \u062a\u0627\u06cc\u067e \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 \u0646\u0648\u0639 \u0648 devX \u0627\u0633\u062a.  \u0627\u06cc\u0646 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631 \u0628\u0627 PostgreSQL \u0648 MySQL \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0628\u0648\u062f\u060c \u0627\u0645\u0627 \u0686\u0646\u062f \u06a9\u0644\u0627\u0633 \u0631\u0627 \u062f\u0631 \u0645\u0639\u0631\u0636 \u062f\u06cc\u062f \u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0647 \u0645\u0627 \u0627\u062c\u0627\u0632\u0647 \u0646\u0648\u0634\u062a\u0646 \u067e\u0631\u0633\u200c\u0648\u200c\u062c\u0648\u0647\u0627 \u0631\u0627 \u0628\u062f\u0648\u0646 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627\u0628\u0637\u0647\u200c\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u0628\u062f\u0647\u0646\u062f.<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u0637\u0631\u0627\u062d\u06cc \u0646\u0648\u0639 CSV \u062e\u0648\u062f \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"kr\">enum<\/span> <span class=\"nx\">PokemonType<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">Water<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">water<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">Grass<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">grass<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">Fire<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">fire<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"c1\">\/\/ ...<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kr\">interface<\/span> <span class=\"nx\">PokemonCSV<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">name<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">customName<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">type<\/span><span class=\"p\">:<\/span> <span class=\"nx\">PokemonType<\/span><span class=\"p\">;<\/span>\n  <span class=\"c1\">\/\/ \ud83d\udc47 In CSVs everything is a string<\/span>\n  <span class=\"nl\">level<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">generation<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">1<\/span><span class=\"dl\">'<\/span> <span class=\"o\">|<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">2<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ ...up to 9<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0639\u062f\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f Kysely \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u0645 \u0648 a \u0631\u0627 \u0646\u0645\u0648\u0646\u0647 \u06a9\u0646\u06cc\u0645 <code>Kysely<\/code> \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"c\"># npm<\/span>\nnpm <span class=\"nb\">install <\/span>kysely\n\n<span class=\"c\"># yarn<\/span>\nyarn add kysely\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">Kysely<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">DummyDriver<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">SqliteAdapter<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">SqliteIntrospector<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">SqliteQueryCompiler<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">kysely<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kr\">interface<\/span> <span class=\"nx\">Database<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">S3Object<\/span><span class=\"p\">:<\/span> <span class=\"nx\">PokemonCSV<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">db<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">Kysely<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Database<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">dialect<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">createAdapter<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">SqliteAdapter<\/span><span class=\"p\">(),<\/span>\n    <span class=\"na\">createDriver<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">DummyDriver<\/span><span class=\"p\">(),<\/span>\n    <span class=\"na\">createIntrospector<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"na\">$db<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Kysely<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">unknown<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">SqliteIntrospector<\/span><span class=\"p\">(<\/span><span class=\"nx\">$db<\/span><span class=\"p\">),<\/span>\n    <span class=\"na\">createQueryCompiler<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">SqliteQueryCompiler<\/span><span class=\"p\">(),<\/span>\n  <span class=\"p\">},<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"c1\">\/\/ That\u2019s it \ud83c\udf89<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0633\u0627\u062f\u0647\u060c \u0646\u0647\u061f  \u0627\u06a9\u0646\u0648\u0646\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0647\u0645\u0627\u0646 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0631\u0627 \u0628\u0646\u0648\u06cc\u0633\u06cc\u0645\u060c \u0627\u0645\u0627 \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0627\u0632 \u0627\u06cc\u0645\u0646\u06cc \u0646\u0648\u0639 \u0648 \u062a\u06a9\u0645\u06cc\u0644 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0644\u0630\u062a \u0645\u06cc \u0628\u0631\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">kyselyQuery<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">db<\/span>\n  <span class=\"p\">.<\/span><span class=\"nx\">selectFrom<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">S3Object<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">.<\/span><span class=\"nx\">select<\/span><span class=\"p\">([<\/span>\n    <span class=\"dl\">'<\/span><span class=\"s1\">id<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"dl\">'<\/span><span class=\"s1\">name<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"dl\">'<\/span><span class=\"s1\">customName<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\">\/\/ \ud83d\ude4c You can rename columns as you like<\/span>\n    <span class=\"dl\">'<\/span><span class=\"s1\">type as pokemonType<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"dl\">'<\/span><span class=\"s1\">level<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\">\/\/ \ud83d\udca5 Will trigger an error:<\/span>\n    <span class=\"dl\">'<\/span><span class=\"s1\">unexistingColumn<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">])<\/span>\n  <span class=\"c1\">\/\/ \ud83d\ude4c Every method is type-safe!<\/span>\n  <span class=\"p\">.<\/span><span class=\"nx\">where<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">generation<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">in<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">1<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">2<\/span><span class=\"dl\">'<\/span><span class=\"p\">])<\/span>\n  <span class=\"p\">.<\/span><span class=\"nx\">where<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">type<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">=<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">PokemonType<\/span><span class=\"p\">.<\/span><span class=\"nx\">Fire<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0631\u0627\u06cc \u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0645\u0627 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u062a\u0632\u0631\u06cc\u0642 \u0647\u0627\u06cc \u0646\u0627\u0645\u0646\u0627\u0633\u0628 SQL\u060c Kysely \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0639\u0628\u0627\u0631\u062a SQL \u0631\u0627 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0645\u0627 \u0642\u0631\u0627\u0631 \u0646\u0645\u06cc \u062f\u0647\u062f\u060c \u0628\u0644\u06a9\u0647 \u06cc\u06a9 <code>sql<\/code> \u0631\u0634\u062a\u0647 \u0648 <code>parameters<\/code> \u0622\u0631\u0627\u06cc\u0647:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"kd\">const<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">sql<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \ud83d\udc48 SQL query with '?' as placeholders<\/span>\n  <span class=\"nx\">parameters<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \ud83d\udc48 Array of parameters<\/span>\n<span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">kyselyQuery<\/span><span class=\"p\">.<\/span><span class=\"nx\">compile<\/span><span class=\"p\">();<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 S3 Select \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627 \u0631\u0627 \u062f\u0631 API \u062e\u0648\u062f \u0646\u0645\u06cc \u067e\u0630\u06cc\u0631\u062f\u060c \u0628\u0627\u06cc\u062f \u062e\u0648\u062f\u0645\u0627\u0646 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627 \u0631\u0627 \u0647\u06cc\u062f\u0631\u0627\u062a\u0647 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">dangerouslyHydrateSQLParameters<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span>\n  <span class=\"nx\">sql<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">parameters<\/span><span class=\"p\">:<\/span> <span class=\"k\">readonly<\/span> <span class=\"nx\">unknown<\/span><span class=\"p\">[],<\/span>\n<span class=\"p\">):<\/span> <span class=\"kr\">string<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"kd\">const<\/span> <span class=\"nx\">parameter<\/span> <span class=\"k\">of<\/span> <span class=\"nx\">parameters<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">sql<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">sql<\/span><span class=\"p\">.<\/span><span class=\"nx\">replace<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">?<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"s2\">`'<\/span><span class=\"p\">${<\/span><span class=\"nb\">String<\/span><span class=\"p\">(<\/span><span class=\"nx\">parameter<\/span><span class=\"p\">)}<\/span><span class=\"s2\">'`<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"nx\">sql<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">sql<\/span><span class=\"p\">,<\/span> <span class=\"nx\">parameters<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">kyselyQuery<\/span><span class=\"p\">.<\/span><span class=\"nx\">compile<\/span><span class=\"p\">();<\/span>\n\n<span class=\"c1\">\/\/ \u26d4\ufe0f **BE SURE TO VALIDATE DYNAMIC PARAMETERS FIRST** \u26d4\ufe0f<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">sqlExpression<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">dangerouslyHydrateSQLParameters<\/span><span class=\"p\">(<\/span><span class=\"nx\">sql<\/span><span class=\"p\">,<\/span> <span class=\"nx\">parameters<\/span><span class=\"p\">);<\/span>\n<span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">sqlExpression<\/span><span class=\"p\">);<\/span>\n\n<span class=\"c1\">\/\/ \ud83d\udc47 We retrieve the same expression as above:<\/span>\n<span class=\"c1\">\/\/ select \"id\", \"name\", \"customName\", \"type\" as \"pokemonType\", \"level\"<\/span>\n<span class=\"c1\">\/\/   from \"S3Object\"<\/span>\n<span class=\"c1\">\/\/   where<\/span>\n<span class=\"c1\">\/\/     \"generation\" in ('1', '2')<\/span>\n<span class=\"c1\">\/\/     and \"type\" = 'fire'<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0627 \u0641\u0642\u0637 \u0628\u0627\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0647 \u062f\u0633\u062a\u0648\u0631 S3 Select \u0648 voil\u00e0 \u062e\u0648\u062f \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u06cc\u0645!  \u0627\u0646\u062c\u0627\u0645 \u0634\u062f!<\/p>\n<p>\u062a\u0642\u0631\u06cc\u0628\u0627\u064b: \u062a\u0648\u062c\u0647 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u0627 \u0641\u0642\u0637 \u0639\u0628\u0627\u0631\u062a \u067e\u0631\u0633 \u0648 \u062c\u0648\u06cc SQL \u062e\u0648\u062f \u0631\u0627 \u062a\u0627\u06cc\u067e \u06a9\u0631\u062f\u06cc\u0645!  \u062f\u0631 \u0645\u0648\u0631\u062f \u067e\u0627\u0633\u062e\u06cc \u06a9\u0647 \u0627\u0632 S3 \u0645\u06cc \u0622\u06cc\u062f \u0686\u0637\u0648\u0631\u061f<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B3%D8%AA%D9%86%D8%A8%D8%A7%D8%B7_%D9%86%D9%88%D8%B9_%D9%BE%D8%A7%D8%B3%D8%AE\"><\/span>\n<p>  \u0627\u0633\u062a\u0646\u0628\u0627\u0637 \u0646\u0648\u0639 \u067e\u0627\u0633\u062e<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u0628\u062a\u062f\u0627\u060c Kysely \u0646\u0647 \u062a\u0646\u0647\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u060c \u0628\u0644\u06a9\u0647 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0646\u06cc\u0632 \u0627\u062c\u0631\u0627 \u06a9\u0631\u062f.  \u0645\u0627 \u0641\u0642\u0637 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0627 \u0628\u0627\u0632\u0631\u0633\u06cc \u0627\u0632 \u0646\u0648\u0639 \u0627\u0633\u062a\u0646\u0628\u0627\u0637 \u0634\u062f\u0647 \u0628\u0647\u0631\u0647 \u0645\u0646\u062f \u0634\u0648\u06cc\u0645 <code>execute<\/code> \u0648\u06cc\u0698\u06af\u06cc \u067e\u0631\u0633 \u0648 \u062c\u0648 Kysely \u0645\u0627.  \u0627\u06cc\u0646 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0628\u0627 \u06a9\u0645\u06a9 \u0628\u0631\u062e\u06cc \u0627\u0632 \u062c\u0627\u062f\u0648\u06af\u0631\u06cc TS \u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">SelectQueryBuilder<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">kysely<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">type<\/span> <span class=\"nx\">QueryResponseRow<\/span><span class=\"o\">&lt;<\/span>\n  <span class=\"c1\">\/\/ \ud83d\udc47 Add a large type constraint<\/span>\n  <span class=\"nx\">KyselyQuery<\/span> <span class=\"kd\">extends<\/span> <span class=\"nx\">SelectQueryBuilder<\/span><span class=\"o\">&lt;<\/span>\n    <span class=\"nb\">Record<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"nx\">unknown<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">,<\/span>\n    <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">unknown<\/span>\n  <span class=\"o\">&gt;<\/span><span class=\"p\">,<\/span>\n<span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span>\n  <span class=\"c1\">\/\/ \ud83d\udc47 Remove the Promise wrapper<\/span>\n  <span class=\"nx\">Awaited<\/span><span class=\"o\">&lt;<\/span>\n    <span class=\"c1\">\/\/ \ud83d\udc47 Get the return type of the execute method<\/span>\n    <span class=\"nx\">ReturnType<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">KyselyQuery<\/span><span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">execute<\/span><span class=\"dl\">'<\/span><span class=\"p\">]<\/span><span class=\"o\">&gt;<\/span>\n    <span class=\"c1\">\/\/ \ud83d\udc47 Unpack the array<\/span>\n  <span class=\"o\">&gt;<\/span><span class=\"p\">[<\/span><span class=\"kr\">number<\/span><span class=\"p\">];<\/span>\n\n<span class=\"kd\">type<\/span> <span class=\"nx\">Pokemon<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">QueryResponseRow<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">typeof<\/span> <span class=\"nx\">kyselyQuery<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\n\n<span class=\"c1\">\/\/ \ud83d\udc47 Equivalent to:<\/span>\n<span class=\"kd\">type<\/span> <span class=\"nx\">Pokemon<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">name<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"c1\">\/\/ \ud83d\udc4d customName is indeed possibly undefined<\/span>\n  <span class=\"nl\">customName<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">undefined<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">level<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"c1\">\/\/ \ud83d\ude4c \"type\" property has been renamed<\/span>\n  <span class=\"nl\">pokemonType<\/span><span class=\"p\">:<\/span> <span class=\"nx\">PokemonType<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u0632 \u0627\u06cc\u0646 \u0646\u0648\u0639 \u067e\u0627\u0633\u062e \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645 <code>parseS3SelectEventStream<\/code> Util \u0648 voil\u00e0!  \u0627\u0646\u062c\u0627\u0645 \u0634\u062f!  \u0628\u0631\u0627\u06cc \u062e\u06cc\u0631 \u0627\u06cc\u0646 \u0628\u0627\u0631 \ud83d\ude42<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0647\u0631 \u062f\u0648 S3 Select \u0648 Kysely \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0628\u0633\u06cc\u0627\u0631 \u062e\u0648\u0628\u06cc \u0647\u0633\u062a\u0646\u062f.  \u0628\u0627 \u067e\u06cc\u0648\u0633\u062a\u0646 \u0628\u0647 \u0647\u0631 \u062f\u0648\u06cc \u0622\u0646\u0647\u0627\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u067e\u0631\u0633\u200c\u0648\u062c\u0648\u0647\u0627\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f\u06cc\u060c \u0645\u0642\u06cc\u0627\u0633\u200c\u067e\u0630\u06cc\u0631 \u0648 \u0645\u0642\u0631\u0648\u0646\u200c\u0628\u0647\u200c\u0635\u0631\u0641\u0647 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u0645 \u0648 \u062f\u0631 \u0639\u06cc\u0646 \u062d\u0627\u0644 \u0627\u0632 \u0627\u06cc\u0645\u0646\u06cc \u0648 \u0627\u0633\u062a\u0646\u062a\u0627\u062c \u0646\u0648\u0639 \u0642\u0648\u06cc \u0648 \u062e\u0634\u06a9 \u0628\u0647\u0631\u0647\u200c\u0645\u0646\u062f \u0634\u0648\u06cc\u0645.<\/p>\n<p><\/p>\n<p>\u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u06cc\u06a9 \u0627\u0634\u06a9\u0627\u0644 \u06a9\u0648\u0686\u06a9 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f\u060c \u0627\u0645\u0627: Kysely 120 \u06a9\u06cc\u0644\u0648\u0628\u0627\u06cc\u062a \u0628\u0647 \u0628\u0633\u062a\u0647\u200c\u0647\u0627\u06cc Lambdas \u0634\u0645\u0627 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f (\u0628\u0631\u0627\u06cc \u06a9\u0645\u06a9 \u0628\u0647 \u0645\u0646 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \ud83d\ude4c).  \u0627\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u0632\u06cc\u0627\u062f\u06cc \u0646\u06cc\u0633\u062a\u060c \u0627\u0645\u0627 \u0642\u0627\u0628\u0644 \u0686\u0634\u0645 \u067e\u0648\u0634\u06cc \u0647\u0645 \u0646\u06cc\u0633\u062a\u060c \u0632\u06cc\u0631\u0627 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc NodeJS Lambdas \u0628\u0627\u0644\u0627\u06cc 5 \u0645\u06af\u0627\u0628\u0627\u06cc\u062a \u0628\u0631 \u0634\u0631\u0648\u0639 \u0633\u0631\u062f \u0622\u0646\u0647\u0627 \u062a\u0623\u062b\u06cc\u0631 \u0645\u0646\u0641\u06cc \u0645\u06cc \u06af\u0630\u0627\u0631\u062f.  \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u0641\u0632\u0648\u062f\u0646 Kysely \u0628\u0647 \u0628\u0633\u062a\u0647\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0645\u062c\u062f\u062f\u0627\u064b \u0627\u0631\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0627\u06af\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0634\u0645\u0627 \u0627\u063a\u0644\u0628 \u062a\u063a\u06cc\u06cc\u0631 \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>S3 Select \u06cc\u06a9 \u0648\u06cc\u0698\u06af\u06cc Amazon S3 \u0627\u0633\u062a \u06a9\u0647 \u0627\u0645\u06a9\u0627\u0646 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0632\u06cc\u0631\u0645\u062c\u0645\u0648\u0639\u0647 \u0647\u0627\u06cc \u0645\u062d\u062a\u0648\u0627\u06cc S3 Objects \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0639\u0628\u0627\u0631\u0627\u062a SQL \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0628\u0646\u062f\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f SELECT \u0648 WHERE \u0628\u0631\u0627\u06cc \u0648\u0627\u06a9\u0634\u06cc \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0627\u0632 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc CSV\u060c JSON \u06cc\u0627 Apache Parquet \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u060c \u062d\u062a\u06cc \u0627\u06af\u0631 \u0628\u0627 GZIP \u0648\/\u06cc\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u062f\u0631 \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u0641\u0634\u0631\u062f\u0647 \u0634\u062f\u0647 \u0628\u0627\u0634\u0646\u062f. &hellip;<\/p>\n","protected":false},"author":2,"featured_media":7791,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-7790","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/7790","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=7790"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/7790\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/7791"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=7790"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=7790"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=7790"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}