{"id":5472,"date":"2025-09-14T08:12:25","date_gmt":"2025-09-14T08:12:25","guid":{"rendered":"https:\/\/pokecon.jp\/job\/?p=5472"},"modified":"2025-09-14T08:12:25","modified_gmt":"2025-09-14T08:12:25","slug":"pgschema-pgschema-terraform-style-declarative-schema-migration-for-postgres","status":"publish","type":"post","link":"https:\/\/pokecon.jp\/job\/5472\/","title":{"rendered":"pgschema\/pgschema: Terraform-style, declarative schema migration for Postgres"},"content":{"rendered":"\n<\/p>\n<div id=\"\">\n<p dir=\"auto\"><a target=\"_blank\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\/\/raw.githubusercontent.com\/pgschema\/pgschema\/main\/docs\/logo\/light.png#gh-light-mode-only\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/pgschema\/pgschema\/main\/docs\/logo\/light.png#gh-light-mode-only\" alt=\"light-banner\" style=\"max-width: 100%;\"\/><\/a><br \/>\n<a target=\"_blank\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\/\/raw.githubusercontent.com\/pgschema\/pgschema\/main\/docs\/logo\/dark.png#gh-dark-mode-only\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/pgschema\/pgschema\/main\/docs\/logo\/dark.png#gh-dark-mode-only\" alt=\"dark-banner\" style=\"max-width: 100%;\"\/><\/a><\/p>\n<p dir=\"auto\"><code>pgschema<\/code> is a CLI tool that brings terraform-style declarative schema migration workflow to Postgres:<\/p>\n<ul dir=\"auto\">\n<li><strong>Dump<\/strong> a Postgres schema in a developer-friendly format with support for all common objects<\/li>\n<li><strong>Edit<\/strong> a schema to the desired state<\/li>\n<li><strong>Plan<\/strong> a schema migration by comparing desired state with current database state<\/li>\n<li><strong>Apply<\/strong> a schema migration with concurrent change detection, transaction-adaptive execution, and lock timeout control<\/li>\n<\/ul>\n<p dir=\"auto\">Think of it as Terraform for your Postgres schemas &#8211; declare your desired state, generate plan, preview changes, and apply them with confidence.<\/p>\n<p dir=\"auto\">Watch in action:<\/p>\n<p dir=\"auto\"><a target=\"_blank\" href=\"https:\/\/asciinema.org\/a\/vXHygDMUkGYsF6nmz2h0ONEQC\" rel=\"nofollow\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/66b07d269b982d6b907a65b2fc477863413954dcb1144ef8ac6fee727b5373a0\/68747470733a2f2f61736369696e656d612e6f72672f612f7658487967444d556b47597346366e6d7a3268304f4e4551432e737667\" alt=\"asciicast\" data-canonical-src=\"https:\/\/asciinema.org\/a\/vXHygDMUkGYsF6nmz2h0ONEQC.svg\" style=\"max-width: 100%;\"\/><\/a><\/p>\n<div class=\"markdown-heading\" dir=\"auto\">\n<h2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\">Supported Postgres version<\/h2>\n<p><a target=\"_blank\" id=\"user-content-supported-postgres-version\" class=\"anchor\" aria-label=\"Permalink: Supported Postgres version\" href=\"#supported-postgres-version\"><svg class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\/><\/svg><\/a><\/div>\n<p dir=\"auto\"><a target=\"_blank\" href=\"https:\/\/github.com\/pgschema\/pgschema\/blob\/a06547f986adc0c7f42cb890420e79569a0e3ec9\/.github\/workflows\/release.yml#L44-L46\">Tested with<\/a> Postgres 14, 15, 16, 17.<\/p>\n<p dir=\"auto\">Follow <a target=\"_blank\" href=\"https:\/\/www.pgschema.com\/installation\" rel=\"nofollow\">https:\/\/www.pgschema.com\/installation<\/a><\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Dump current schema&#10;$ PGPASSWORD=testpwd1 pgschema dump \\&#10;    --host localhost \\&#10;    --db testdb \\&#10;    --user postgres \\&#10;    --schema public &gt; schema.sql\">\n<pre><span class=\"pl-c\"><span class=\"pl-c\">#<\/span> Dump current schema<\/span>\n$ PGPASSWORD=testpwd1 pgschema dump \\\n    --host localhost \\\n    --db testdb \\\n    --user postgres \\\n    --schema public <span class=\"pl-k\">&gt;<\/span> schema.sql<\/pre>\n<\/div>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Edit schema file declaratively&#10;--- a\/schema.sql&#10;+++ b\/schema.sql&#10;@@ -12,5 +12,6 @@&#10;&#10; CREATE TABLE IF NOT EXISTS users (&#10;     id SERIAL PRIMARY KEY,&#10;-    username varchar(50) NOT NULL UNIQUE&#10;+    username varchar(50) NOT NULL UNIQUE,&#10;+    age INT NOT NULL&#10; );\">\n<pre><span class=\"pl-c\"><span class=\"pl-c\">#<\/span> Edit schema file declaratively<\/span>\n--- a\/schema.sql\n+++ b\/schema.sql\n@@ -12,5 +12,6 @@\n\n CREATE TABLE IF NOT EXISTS users (\n     id SERIAL PRIMARY KEY,\n-    username varchar(50) NOT NULL UNIQUE\n+    username varchar(50) NOT NULL UNIQUE,\n+    age INT NOT NULL\n )<span class=\"pl-k\">;<\/span><\/pre>\n<\/div>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ PGPASSWORD=testpwd1 pgschema plan \\&#10;    --host localhost \\&#10;    --db testdb \\&#10;    --user postgres \\&#10;    --schema public \\&#10;    --file schema.sql \\&#10;    --output-human stdout \\&#10;    --output-json plan.json&#10;&#10;Plan: 1 to modify.&#10;&#10;Summary by type:&#10;  tables: 1 to modify&#10;&#10;Tables:&#10;  ~ users&#10;    + age (column)&#10;&#10;Transaction: true&#10;&#10;DDL to be executed:&#10;--------------------------------------------------&#10;&#10;ALTER TABLE users ADD COLUMN age integer NOT NULL;\">\n<pre>$ PGPASSWORD=testpwd1 pgschema plan \\\n    --host localhost \\\n    --db testdb \\\n    --user postgres \\\n    --schema public \\\n    --file schema.sql \\\n    --output-human stdout \\\n    --output-json plan.json\n\nPlan: 1 to modify.\n\nSummary by type:\n  tables: 1 to modify\n\nTables:\n  <span class=\"pl-k\">~<\/span> users\n    + age (column)\n\nTransaction: <span class=\"pl-c1\">true<\/span>\n\nDDL to be executed:\n--------------------------------------------------\n\nALTER TABLE users ADD COLUMN age integer NOT NULL<span class=\"pl-k\">;<\/span><\/pre>\n<\/div>\n<div class=\"markdown-heading\" dir=\"auto\">\n<h3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\">Step 4: Apply plan with confirmation<\/h3>\n<p><a target=\"_blank\" id=\"user-content-step-4-apply-plan-with-confirmation\" class=\"anchor\" aria-label=\"Permalink: Step 4: Apply plan with confirmation\" href=\"#step-4-apply-plan-with-confirmation\"><svg class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\/><\/svg><\/a><\/div>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Or use --auto-approve to skip confirmation&#10;$ PGPASSWORD=testpwd1 pgschema apply \\&#10;    --host localhost \\&#10;    --db testdb \\&#10;    --user postgres \\&#10;    --schema public \\&#10;    --plan plan.json&#10;&#10;Plan: 1 to modify.&#10;&#10;Summary by type:&#10;  tables: 1 to modify&#10;&#10;Tables:&#10;  ~ users&#10;    + age (column)&#10;&#10;Transaction: true&#10;&#10;DDL to be executed:&#10;--------------------------------------------------&#10;&#10;ALTER TABLE users ADD COLUMN age integer NOT NULL;&#10;&#10;Do you want to apply these changes? (yes\/no): yes&#10;&#10;Applying changes...&#10;Changes applied successfully!\">\n<pre><span class=\"pl-c\"><span class=\"pl-c\">#<\/span> Or use --auto-approve to skip confirmation<\/span>\n$ PGPASSWORD=testpwd1 pgschema apply \\\n    --host localhost \\\n    --db testdb \\\n    --user postgres \\\n    --schema public \\\n    --plan plan.json\n\nPlan: 1 to modify.\n\nSummary by type:\n  tables: 1 to modify\n\nTables:\n  <span class=\"pl-k\">~<\/span> users\n    + age (column)\n\nTransaction: <span class=\"pl-c1\">true<\/span>\n\nDDL to be executed:\n--------------------------------------------------\n\nALTER TABLE users ADD COLUMN age integer NOT NULL<span class=\"pl-k\">;<\/span>\n\nDo you want to apply these changes<span class=\"pl-k\">?<\/span> (yes\/no): yes\n\nApplying changes...\nChanges applied successfully<span class=\"pl-k\">!<\/span><\/pre>\n<\/div>\n<p dir=\"auto\"><a target=\"_blank\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\/\/raw.githubusercontent.com\/pgschema\/pgschema\/main\/docs\/images\/copy-page.webp\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/pgschema\/pgschema\/main\/docs\/images\/copy-page.webp\" alt=\"_\" style=\"max-width: 100%;\"\/><\/a><\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https:\/\/github.com\/pgschema\/pgschema.git&#10;cd pgschema&#10;go mod tidy&#10;go build -o pgschema .\">\n<pre>git clone https:\/\/github.com\/pgschema\/pgschema.git\n<span class=\"pl-c1\">cd<\/span> pgschema\ngo mod tidy\ngo build -o pgschema <span class=\"pl-c1\">.<\/span><\/pre>\n<\/div>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Run unit tests only&#10;go test -short -v .\/...&#10;&#10;# Run all tests including integration tests (uses Postgres testcontainers with Docker)&#10;go test -v .\/...\">\n<pre><span class=\"pl-c\"><span class=\"pl-c\">#<\/span> Run unit tests only<\/span>\ngo <span class=\"pl-c1\">test<\/span> -short -v .\/...\n\n<span class=\"pl-c\"><span class=\"pl-c\">#<\/span> Run all tests including integration tests (uses Postgres testcontainers with Docker)<\/span>\ngo <span class=\"pl-c1\">test<\/span> -v .\/...<\/pre>\n<\/div>\n<p dir=\"auto\"><a target=\"_blank\" href=\"https:\/\/www.bytebase.com?source=pgschema\" rel=\"nofollow\">Bytebase<\/a> &#8211; open source, web-based database DevSecOps platform.<\/p>\n<p dir=\"auto\"><a target=\"_blank\" href=\"https:\/\/www.bytebase.com?source=pgschema\" rel=\"nofollow\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/pgschema\/pgschema\/main\/docs\/images\/bytebase.webp\" style=\"max-width: 100%;\"\/><\/a><\/p>\n<p><a target=\"_blank\" href=\"https:\/\/www.star-history.com\/#pgschema\/pgschema&amp;Date\" rel=\"nofollow\">\n <themed-picture data-catalyst-inline=\"true\"><picture><source media=\"(prefers-color-scheme: dark)\" srcset=\"https:\/\/camo.githubusercontent.com\/fb0ea0ca9cf15ee6ee461f7d1831b7d356ffbc332a987d22bb37d5ceaee5667a\/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f7376673f7265706f733d7067736368656d612f7067736368656d6126747970653d44617465267468656d653d6461726b\" data-canonical-src=\"https:\/\/api.star-history.com\/svg?repos=pgschema\/pgschema&amp;type=Date&amp;theme=dark\"><source media=\"(prefers-color-scheme: light)\" srcset=\"https:\/\/camo.githubusercontent.com\/68db70a954d75773849b590f976a15585369b481f4f7beda263d3b4d370ae0c4\/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f7376673f7265706f733d7067736368656d612f7067736368656d6126747970653d44617465\" data-canonical-src=\"https:\/\/api.star-history.com\/svg?repos=pgschema\/pgschema&amp;type=Date\"><img decoding=\"async\" alt=\"Star History Chart\" src=\"https:\/\/camo.githubusercontent.com\/68db70a954d75773849b590f976a15585369b481f4f7beda263d3b4d370ae0c4\/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f7376673f7265706f733d7067736368656d612f7067736368656d6126747970653d44617465\" data-canonical-src=\"https:\/\/api.star-history.com\/svg?repos=pgschema\/pgschema&amp;type=Date\"\/><br \/>\n <\/source><\/source><\/picture><\/themed-picture>\n<\/a>\n<\/div>\n\n<br \/><a href=\"https:\/\/github.com\/pgschema\/pgschema\">\u5143\u306e\u8a18\u4e8b\u3092\u78ba\u8a8d\u3059\u308b <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"pgschema is a CLI tool that brings terraform-style declarative schema migration workflow to Postgres: Dump a P [&hellip;]","protected":false},"author":1,"featured_media":5473,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-5472","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hatena-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>pgschema\/pgschema: Terraform-style, declarative schema migration for Postgres - \u30dd\u30b1\u30b3\u30f3<\/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:\/\/github.com\/pgschema\/pgschema\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"pgschema\/pgschema: Terraform-style, declarative schema migration for Postgres - \u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"og:description\" content=\"pgschema is a CLI tool that brings terraform-style declarative schema migration workflow to Postgres: Dump a P [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/github.com\/pgschema\/pgschema\" \/>\n<meta property=\"og:site_name\" content=\"\u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-14T08:12:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/09\/pgschema.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"info@pokecon.jp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"info@pokecon.jp\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"2\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/github.com\\\/pgschema\\\/pgschema#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/5472\\\/\"},\"author\":{\"name\":\"info@pokecon.jp\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"headline\":\"pgschema\\\/pgschema: Terraform-style, declarative schema migration for Postgres\",\"datePublished\":\"2025-09-14T08:12:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/5472\\\/\"},\"wordCount\":121,\"image\":{\"@id\":\"https:\\\/\\\/github.com\\\/pgschema\\\/pgschema#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/pgschema.png\",\"articleSection\":[\"\u306f\u3066\u306a\u30d6\u30ed\u30b0\"],\"inLanguage\":\"ja\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/5472\\\/\",\"url\":\"https:\\\/\\\/github.com\\\/pgschema\\\/pgschema\",\"name\":\"pgschema\\\/pgschema: Terraform-style, declarative schema migration for Postgres - \u30dd\u30b1\u30b3\u30f3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/github.com\\\/pgschema\\\/pgschema#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/github.com\\\/pgschema\\\/pgschema#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/pgschema.png\",\"datePublished\":\"2025-09-14T08:12:25+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/github.com\\\/pgschema\\\/pgschema#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/github.com\\\/pgschema\\\/pgschema\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/github.com\\\/pgschema\\\/pgschema#primaryimage\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/pgschema.png\",\"contentUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/pgschema.png\",\"width\":1200,\"height\":600},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/github.com\\\/pgschema\\\/pgschema#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"pgschema\\\/pgschema: Terraform-style, declarative schema migration for Postgres\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\",\"name\":\"\u30dd\u30b1\u30b3\u30f3\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\",\"name\":\"info@pokecon.jp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"caption\":\"info@pokecon.jp\"},\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/author\\\/infopokecon-jp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"pgschema\/pgschema: Terraform-style, declarative schema migration for Postgres - \u30dd\u30b1\u30b3\u30f3","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:\/\/github.com\/pgschema\/pgschema","og_locale":"ja_JP","og_type":"article","og_title":"pgschema\/pgschema: Terraform-style, declarative schema migration for Postgres - \u30dd\u30b1\u30b3\u30f3","og_description":"pgschema is a CLI tool that brings terraform-style declarative schema migration workflow to Postgres: Dump a P [&hellip;]","og_url":"https:\/\/github.com\/pgschema\/pgschema","og_site_name":"\u30dd\u30b1\u30b3\u30f3","article_published_time":"2025-09-14T08:12:25+00:00","og_image":[{"width":1200,"height":600,"url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/09\/pgschema.png","type":"image\/png"}],"author":"info@pokecon.jp","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"info@pokecon.jp","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"2\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/github.com\/pgschema\/pgschema#article","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/5472\/"},"author":{"name":"info@pokecon.jp","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"headline":"pgschema\/pgschema: Terraform-style, declarative schema migration for Postgres","datePublished":"2025-09-14T08:12:25+00:00","mainEntityOfPage":{"@id":"https:\/\/pokecon.jp\/job\/5472\/"},"wordCount":121,"image":{"@id":"https:\/\/github.com\/pgschema\/pgschema#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/09\/pgschema.png","articleSection":["\u306f\u3066\u306a\u30d6\u30ed\u30b0"],"inLanguage":"ja"},{"@type":"WebPage","@id":"https:\/\/pokecon.jp\/job\/5472\/","url":"https:\/\/github.com\/pgschema\/pgschema","name":"pgschema\/pgschema: Terraform-style, declarative schema migration for Postgres - \u30dd\u30b1\u30b3\u30f3","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/#website"},"primaryImageOfPage":{"@id":"https:\/\/github.com\/pgschema\/pgschema#primaryimage"},"image":{"@id":"https:\/\/github.com\/pgschema\/pgschema#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/09\/pgschema.png","datePublished":"2025-09-14T08:12:25+00:00","author":{"@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"breadcrumb":{"@id":"https:\/\/github.com\/pgschema\/pgschema#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/github.com\/pgschema\/pgschema"]}]},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/github.com\/pgschema\/pgschema#primaryimage","url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/09\/pgschema.png","contentUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/09\/pgschema.png","width":1200,"height":600},{"@type":"BreadcrumbList","@id":"https:\/\/github.com\/pgschema\/pgschema#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/pokecon.jp\/job\/"},{"@type":"ListItem","position":2,"name":"pgschema\/pgschema: Terraform-style, declarative schema migration for Postgres"}]},{"@type":"WebSite","@id":"https:\/\/pokecon.jp\/job\/#website","url":"https:\/\/pokecon.jp\/job\/","name":"\u30dd\u30b1\u30b3\u30f3","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/pokecon.jp\/job\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997","name":"info@pokecon.jp","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","caption":"info@pokecon.jp"},"url":"https:\/\/pokecon.jp\/job\/author\/infopokecon-jp\/"}]}},"_links":{"self":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/5472","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/comments?post=5472"}],"version-history":[{"count":1,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/5472\/revisions"}],"predecessor-version":[{"id":5474,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/5472\/revisions\/5474"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media\/5473"}],"wp:attachment":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media?parent=5472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/categories?post=5472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/tags?post=5472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}