{"id":50566,"date":"2023-12-28T10:47:36","date_gmt":"2023-03-02T16:10:05","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/"},"modified":"2024-05-04T15:43:59","modified_gmt":"2024-05-04T07:43:59","slug":"%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/","title":{"rendered":"\u6574\u7406\u4e86Go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177"},"content":{"rendered":"<h1>\u76f8\u5bf9\u6bd4\u8f83<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">CLI\u3067\u4f7f\u3048\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">MySQL\u304c\u4f7f\u3048\u308b<\/ul>\n<div>\n<div class=\"post-table\">\u540d\u524dStar\u6570\u30b9\u30ad\u30fc\u30de\u65b9\u5f0fDry Run\u8a2d\u5b9a<a href=\"https:\/\/bitbucket.org\/liamstask\/goose\" target=\"_blank\" rel=\"nofollow noopener\">liamstask\/goose<\/a>-Go\/SQLUp\/Down-YAML<a href=\"https:\/\/github.com\/mattes\/migrate\" target=\"_blank\" rel=\"nofollow noopener\">mattes\/migrate<\/a>892SQLUp\/Down&#8211;<a href=\"https:\/\/github.com\/rubenv\/sql-migrate\" target=\"_blank\" rel=\"nofollow noopener\">rubenv\/sql-migrate<\/a>576SQLUp\/Down\u2714YAML<a href=\"https:\/\/github.com\/elwinar\/rambler\" target=\"_blank\" rel=\"nofollow noopener\">elwinar\/rambler<\/a>371SQLUp\/Down-JSON<a href=\"https:\/\/github.com\/naoina\/migu\" target=\"_blank\" rel=\"nofollow noopener\">naoina\/migu<\/a>29Go(struct)Sync\u2714-<a href=\"https:\/\/github.com\/dev-cloverlab\/carpenter\" target=\"_blank\" rel=\"nofollow noopener\">dev-cloverlab\/carpenter<\/a>12JSON\/\u5b9fDBSync\u2714-<\/div>\n<\/div>\n<p>2017\u5e741\u6708\u7684\u65f6\u5019<\/p>\n<p>\u672c\u6b21\u6bd4\u8f83\u6ca1\u6709\u8003\u8651\u7684\u5185\u5bb9\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/github.com\/tanel\/dbmigrate<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/github.com\/BurntSushi\/migration<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/github.com\/Boostport\/migration<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/github.com\/github\/gh-ost<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/github.com\/wawandco\/transporter<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/github.com\/GuiaBolso\/darwin<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/github.com\/DavidHuie\/gomigrate<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/github.com\/go-gormigrate\/gormigrate<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/github.com\/pravasan\/pravasan<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">https:\/\/github.com\/eure\/kamimai<\/ul>\n<h1>liamstask\/goose =&gt; liamstask\/goose<\/h1>\n<p>\u5904\u7406\u6570\u636e\u5e93<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MySQL<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">PostgreSQL<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">SQLite3<\/ul>\n<p>\u5b89\u88c5<\/p>\n<pre class=\"post-pre\"><code>go get bitbucket.org\/liamstask\/goose\/cmd\/goose\r\n<\/code><\/pre>\n<p>\u8bbe\u5b9a<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">development<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">driver<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n  <span class=\"na\">open<\/span><span class=\"pi\">:<\/span> <span class=\"s\">user=root dbname=goose_test<\/span>\r\n<\/code><\/pre>\n<p>\u6742\u611f<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u666e\u901a\u306a\u611f\u3058<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u4f7f\u3063\u3066\u308b\u4eba\u591a\u305d\u3046<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u9069\u7528\u5c65\u6b74\u304c\u30c6\u30fc\u30d6\u30eb\u306b\u6b8b\u308b\u306e\u306f\u826f\u3044<\/ul>\n<h2>\u8fc1\u79fb\u6587\u4ef6<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>goose create CreatePosts sql\r\ngoose: created \/Users\/nownabe\/src\/github.com\/nownabe\/research-go\/migration-tools\/goose\/db\/migrations\/20170111152547_CreatePosts.sql\r\n<\/code><\/pre>\n<p>\u4f7f\u7528CLI\u521b\u5efa\u6a21\u677f\u5e76\u5c06Up\/Down\u7684SQL\u5199\u5165\u5230\u6587\u4ef6\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">-- +goose Up<\/span>\r\n<span class=\"c1\">-- SQL in section 'Up' is executed when this migration is applied<\/span>\r\n<span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"nv\">`posts`<\/span> <span class=\"p\">(<\/span>\r\n  <span class=\"nv\">`post_id`<\/span> <span class=\"nb\">INT<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span> <span class=\"n\">AUTO_INCREMENT<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nv\">`author`<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">255<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nv\">`text`<\/span> <span class=\"nb\">TEXT<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span>\r\n<span class=\"p\">)<\/span> <span class=\"n\">ENGINE<\/span> <span class=\"o\">=<\/span> <span class=\"n\">InnoDB<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"c1\">-- +goose Down<\/span>\r\n<span class=\"c1\">-- SQL section 'Down' is executed when this migration is rolled back<\/span>\r\n<span class=\"k\">DROP<\/span> <span class=\"k\">TABLE<\/span> <span class=\"nv\">`posts`<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u867d\u7136Go\u8bed\u8a00\u4e5f\u53ef\u4ee5\u7f16\u5199\u8fc1\u79fb\u6587\u4ef6\uff0c\u4f46\u7531\u4e8e\u4f3c\u4e4e\u4e0d\u592a\u9700\u8981\uff0c\u6240\u4ee5\u7701\u7565\u3002<\/p>\n<h2>\u547d\u4ee4<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>goose\r\ngoose is a database migration management system <span class=\"k\">for <\/span>Go projects.\r\n\r\nUsage:\r\n    goose <span class=\"o\">[<\/span>options] &lt;subcommand&gt; <span class=\"o\">[<\/span>subcommand options]\r\n\r\nOptions:\r\n  <span class=\"nt\">-env<\/span> string\r\n        which DB environment to use <span class=\"o\">(<\/span>default <span class=\"s2\">\"development\"<\/span><span class=\"o\">)<\/span>\r\n  <span class=\"nt\">-path<\/span> string\r\n        folder containing db info <span class=\"o\">(<\/span>default <span class=\"s2\">\"db\"<\/span><span class=\"o\">)<\/span>\r\n  <span class=\"nt\">-pgschema<\/span> string\r\n        which postgres-schema to migrate <span class=\"o\">(<\/span>default <span class=\"o\">=<\/span> none<span class=\"o\">)<\/span>\r\n\r\nCommands:\r\n    up         Migrate the DB to the most recent version available\r\n    down       Roll back the version by 1\r\n    redo       Re-run the latest migration\r\n    status     dump the migration status <span class=\"k\">for <\/span>the current DB\r\n    create     Create the scaffolding <span class=\"k\">for <\/span>a new migration\r\n    dbversion  Print the current version of the database\r\n<\/code><\/pre>\n<h2>\u7248\u672c\u7ba1\u7406<\/h2>\n<p>\u4fdd\u5b58\u5728\u540d\u4e3agoose_db_version\u7684\u8868\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">&gt;<\/span> <span class=\"k\">select<\/span> <span class=\"o\">*<\/span> <span class=\"k\">from<\/span> <span class=\"n\">goose_db_version<\/span><span class=\"p\">;<\/span>\r\n<span class=\"o\">+<\/span><span class=\"c1\">----+----------------+------------+---------------------+<\/span>\r\n<span class=\"o\">|<\/span> <span class=\"n\">id<\/span> <span class=\"o\">|<\/span> <span class=\"n\">version_id<\/span>     <span class=\"o\">|<\/span> <span class=\"n\">is_applied<\/span> <span class=\"o\">|<\/span> <span class=\"n\">tstamp<\/span>              <span class=\"o\">|<\/span>\r\n<span class=\"o\">+<\/span><span class=\"c1\">----+----------------+------------+---------------------+<\/span>\r\n<span class=\"o\">|<\/span>  <span class=\"mi\">1<\/span> <span class=\"o\">|<\/span>              <span class=\"mi\">0<\/span> <span class=\"o\">|<\/span>          <span class=\"mi\">1<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">2017<\/span><span class=\"o\">-<\/span><span class=\"mi\">01<\/span><span class=\"o\">-<\/span><span class=\"mi\">11<\/span> <span class=\"mi\">15<\/span><span class=\"p\">:<\/span><span class=\"mi\">35<\/span><span class=\"p\">:<\/span><span class=\"mi\">03<\/span> <span class=\"o\">|<\/span>\r\n<span class=\"o\">|<\/span>  <span class=\"mi\">2<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">20170111152547<\/span> <span class=\"o\">|<\/span>          <span class=\"mi\">1<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">2017<\/span><span class=\"o\">-<\/span><span class=\"mi\">01<\/span><span class=\"o\">-<\/span><span class=\"mi\">11<\/span> <span class=\"mi\">15<\/span><span class=\"p\">:<\/span><span class=\"mi\">47<\/span><span class=\"p\">:<\/span><span class=\"mi\">34<\/span> <span class=\"o\">|<\/span>\r\n<span class=\"o\">|<\/span>  <span class=\"mi\">3<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">20170111152547<\/span> <span class=\"o\">|<\/span>          <span class=\"mi\">0<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">2017<\/span><span class=\"o\">-<\/span><span class=\"mi\">01<\/span><span class=\"o\">-<\/span><span class=\"mi\">11<\/span> <span class=\"mi\">15<\/span><span class=\"p\">:<\/span><span class=\"mi\">47<\/span><span class=\"p\">:<\/span><span class=\"mi\">36<\/span> <span class=\"o\">|<\/span>\r\n<span class=\"o\">|<\/span>  <span class=\"mi\">4<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">20170111152547<\/span> <span class=\"o\">|<\/span>          <span class=\"mi\">1<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">2017<\/span><span class=\"o\">-<\/span><span class=\"mi\">01<\/span><span class=\"o\">-<\/span><span class=\"mi\">11<\/span> <span class=\"mi\">15<\/span><span class=\"p\">:<\/span><span class=\"mi\">47<\/span><span class=\"p\">:<\/span><span class=\"mi\">36<\/span> <span class=\"o\">|<\/span>\r\n<span class=\"o\">|<\/span>  <span class=\"mi\">5<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">20170111152547<\/span> <span class=\"o\">|<\/span>          <span class=\"mi\">0<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">2017<\/span><span class=\"o\">-<\/span><span class=\"mi\">01<\/span><span class=\"o\">-<\/span><span class=\"mi\">11<\/span> <span class=\"mi\">15<\/span><span class=\"p\">:<\/span><span class=\"mi\">47<\/span><span class=\"p\">:<\/span><span class=\"mi\">53<\/span> <span class=\"o\">|<\/span>\r\n<span class=\"o\">|<\/span>  <span class=\"mi\">6<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">20170111152547<\/span> <span class=\"o\">|<\/span>          <span class=\"mi\">1<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">2017<\/span><span class=\"o\">-<\/span><span class=\"mi\">01<\/span><span class=\"o\">-<\/span><span class=\"mi\">11<\/span> <span class=\"mi\">15<\/span><span class=\"p\">:<\/span><span class=\"mi\">48<\/span><span class=\"p\">:<\/span><span class=\"mi\">06<\/span> <span class=\"o\">|<\/span>\r\n<span class=\"o\">+<\/span><span class=\"c1\">----+----------------+------------+---------------------+<\/span>\r\n<span class=\"mi\">6<\/span> <span class=\"k\">rows<\/span> <span class=\"k\">in<\/span> <span class=\"k\">set<\/span> <span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">.<\/span><span class=\"mi\">00<\/span> <span class=\"n\">sec<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<h1>[\u7ca4\u8bed] \u8fc1\u79fb\/\u8fc1\u5f99<\/h1>\n<p>\u5904\u7406\u6570\u636e\u5e93<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Cassandra<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MongoDB<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MySQL (experimental)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">PostgreSQL<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">SQLite<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Ql<\/ul>\n<p>\u5b89\u88c5<\/p>\n<pre class=\"post-pre\"><code>go get <span class=\"nt\">-u<\/span> github.com\/mattes\/migrate\r\n<\/code><\/pre>\n<p>\u611f\u60f3<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30b3\u30de\u30f3\u30c9\u304c\u8c4a\u5bcc<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">CLI\u306e\u7d50\u679c\u304c\u8272\u4ed8\u304d\u3067\u898b\u3084\u3059\u3044<\/ul>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d9257913a08637a6e2394\/34-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2017-01-11 16.39.19.png (43.4 kB)\" \/><\/div>\n<h2>\u8fc1\u79fb\u6587\u4ef6<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>migrate <span class=\"nt\">-url<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"mysql:\/\/root@tcp(127.0.0.1:3306)\/migrate_test\"<\/span> create create_posts\r\nVersion 1484119339 migration files created <span class=\"k\">in<\/span> \/Users\/nownabe\/src\/github.com\/nownabe\/research-go\/migration-tools\/goose:\r\n1484119339_create_posts.up.sql\r\n1484119339_create_posts.down.sql\r\n<\/code><\/pre>\n<p>\u5728CLI\u4e2d\uff0c\u5c06\u4f1a\u521b\u5efa\u4e0a\u5347\/\u4e0b\u964d\u4e24\u79cd\u6a21\u677f\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"nv\">`posts`<\/span> <span class=\"p\">(<\/span>\r\n  <span class=\"nv\">`post_id`<\/span> <span class=\"nb\">INT<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span> <span class=\"n\">AUTO_INCREMENT<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nv\">`author`<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">255<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nv\">`text`<\/span> <span class=\"nb\">TEXT<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span>\r\n<span class=\"p\">)<\/span> <span class=\"n\">ENGINE<\/span> <span class=\"o\">=<\/span> <span class=\"n\">InnoDB<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">DROP<\/span> <span class=\"k\">TABLE<\/span> <span class=\"nv\">`posts`<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<h2>\u547d\u4ee4<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>migrate\r\nusage: migrate <span class=\"o\">[<\/span><span class=\"nt\">-path<\/span><span class=\"o\">=<\/span>&lt;path&gt;] <span class=\"nt\">-url<\/span><span class=\"o\">=<\/span>&lt;url&gt; &lt;<span class=\"nb\">command<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">[<\/span>&lt;args&gt;]\r\n\r\nCommands:\r\n   create &lt;name&gt;  Create a new migration\r\n   up             Apply all <span class=\"nt\">-up-<\/span> migrations\r\n   down           Apply all <span class=\"nt\">-down-<\/span> migrations\r\n   reset          Down followed by Up\r\n   redo           Roll back most recent migration, <span class=\"k\">then <\/span>apply it again\r\n   version        Show current migration version\r\n   migrate &lt;n&gt;    Apply migrations <span class=\"nt\">-n<\/span>|+n\r\n   goto &lt;v&gt;       Migrate to version v\r\n   <span class=\"nb\">help           <\/span>Show this <span class=\"nb\">help<\/span>\r\n\r\n<span class=\"s1\">'-path'<\/span> defaults to current working directory.\r\n<\/code><\/pre>\n<h2>\u7248\u672c\u63a7\u5236<\/h2>\n<p>\u5c06\u5176\u4fdd\u5b58\u5728\u540d\u4e3a&#8221;schema_migrations&#8221;\u7684\u8868\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">&gt;<\/span> <span class=\"k\">select<\/span> <span class=\"o\">*<\/span> <span class=\"k\">from<\/span> <span class=\"n\">schema_migrations<\/span><span class=\"p\">;<\/span>\r\n<span class=\"o\">+<\/span><span class=\"c1\">------------+<\/span>\r\n<span class=\"o\">|<\/span> <span class=\"k\">version<\/span>    <span class=\"o\">|<\/span>\r\n<span class=\"o\">+<\/span><span class=\"c1\">------------+<\/span>\r\n<span class=\"o\">|<\/span> <span class=\"mi\">1484119339<\/span> <span class=\"o\">|<\/span>\r\n<span class=\"o\">+<\/span><span class=\"c1\">------------+<\/span>\r\n<span class=\"mi\">1<\/span> <span class=\"k\">row<\/span> <span class=\"k\">in<\/span> <span class=\"k\">set<\/span> <span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">.<\/span><span class=\"mi\">00<\/span> <span class=\"n\">sec<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<h1>rubenv\/sql-migrate \u53ef\u4ee5\u5c06\u6570\u636e\u5e93\u8fc1\u79fb\u5de5\u4f5c\u81ea\u52a8\u5316\u3002<\/h1>\n<p>\u6570\u636e\u5e93\u5904\u7406<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MySQL<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MSSQL<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Oracle Database<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">PostgreSQL<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">SQLite<\/ul>\n<p>\u5b89\u88c5<\/p>\n<pre class=\"post-pre\"><code>go get github.com\/rubenv\/sql-migrate\/...\r\n<\/code><\/pre>\n<p>\u8bbe\u5b9a<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">development<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">dialect<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n  <span class=\"na\">datasource<\/span><span class=\"pi\">:<\/span> <span class=\"s\">root:@tcp(127.0.0.1:3306)\/sqlmigrate_test?parseTime=true<\/span>\r\n  <span class=\"na\">dir<\/span><span class=\"pi\">:<\/span> <span class=\"s\">migrations\/mysql<\/span> <span class=\"c1\"># \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u3063\u3066\u304a\u304f\u5fc5\u8981\u304c\u3042\u308b<\/span>\r\n<\/code><\/pre>\n<p>\u6742\u611f<\/p>\n<ul class=\"post-ul\">\u5bfe\u5fdcRDBMS\u304c\u591a\u3044<\/ul>\n<h2>\u8fc1\u79fb\u6587\u4ef6<\/h2>\n<p>\u6ca1\u6709\u96cf\u5f62\u5236\u4f5c\u529f\u80fd\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">-- +migrate Up<\/span>\r\n<span class=\"c1\">-- SQL in section 'Up' is executed when this migration is applied<\/span>\r\n<span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"nv\">`posts`<\/span> <span class=\"p\">(<\/span>\r\n  <span class=\"nv\">`post_id`<\/span> <span class=\"nb\">INT<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span> <span class=\"n\">AUTO_INCREMENT<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nv\">`author`<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">255<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nv\">`text`<\/span> <span class=\"nb\">TEXT<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span>\r\n<span class=\"p\">)<\/span> <span class=\"n\">ENGINE<\/span> <span class=\"o\">=<\/span> <span class=\"n\">InnoDB<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"c1\">-- +migrate Down<\/span>\r\n<span class=\"c1\">-- SQL section 'Down' is executed when this migration is rolled back<\/span>\r\n<span class=\"k\">DROP<\/span> <span class=\"k\">TABLE<\/span> <span class=\"nv\">`posts`<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<h2>Command. (\u547d\u4ee4)<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>sql-migrate\r\nusage: sql-migrate <span class=\"o\">[<\/span><span class=\"nt\">--version<\/span><span class=\"o\">]<\/span> <span class=\"o\">[<\/span><span class=\"nt\">--help<\/span><span class=\"o\">]<\/span> &lt;<span class=\"nb\">command<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">[<\/span>&lt;args&gt;]\r\n\r\nAvailable commands are:\r\n    down      Undo a database migration\r\n    redo      Reapply the last migration\r\n    status    Show migration status\r\n    up        Migrates the database to the most recent version available\r\n<\/code><\/pre>\n<h2>\u7248\u672c\u7ba1\u7406<\/h2>\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u5b83\u5c06\u4fdd\u5b58\u5728\u540d\u4e3agorp_migrations\u7684\u8868\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">&gt;<\/span> <span class=\"k\">select<\/span> <span class=\"o\">*<\/span> <span class=\"k\">from<\/span> <span class=\"n\">gorp_migrations<\/span><span class=\"p\">;<\/span>\r\n<span class=\"o\">+<\/span><span class=\"c1\">--------------------+---------------------+<\/span>\r\n<span class=\"o\">|<\/span> <span class=\"n\">id<\/span>                 <span class=\"o\">|<\/span> <span class=\"n\">applied_at<\/span>          <span class=\"o\">|<\/span>\r\n<span class=\"o\">+<\/span><span class=\"c1\">--------------------+---------------------+<\/span>\r\n<span class=\"o\">|<\/span> <span class=\"mi\">1<\/span><span class=\"n\">_create_posts<\/span><span class=\"p\">.<\/span><span class=\"k\">sql<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">2017<\/span><span class=\"o\">-<\/span><span class=\"mi\">01<\/span><span class=\"o\">-<\/span><span class=\"mi\">11<\/span> <span class=\"mi\">08<\/span><span class=\"p\">:<\/span><span class=\"mi\">12<\/span><span class=\"p\">:<\/span><span class=\"mi\">18<\/span> <span class=\"o\">|<\/span>\r\n<span class=\"o\">+<\/span><span class=\"c1\">--------------------+---------------------+<\/span>\r\n<span class=\"mi\">1<\/span> <span class=\"k\">row<\/span> <span class=\"k\">in<\/span> <span class=\"k\">set<\/span> <span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">.<\/span><span class=\"mi\">00<\/span> <span class=\"n\">sec<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<h1>\u57c3\u5c14\u7ef4\u7eb3\/\u6f2b\u6b65\u8005<\/h1>\n<p>\u6570\u636e\u5e93\u9002\u914d<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MySQL<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">PostgreSQL<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">SQLite<\/ul>\n<p>\u5b89\u88c5<\/p>\n<pre class=\"post-pre\"><code>go get github.com\/elwinar\/rambler\r\n<\/code><\/pre>\n<p>\u8bbe\u5b9a<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"nl\">\"driver\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"mysql\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"protocol\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"tcp\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"host\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"localhost\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"port\"<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3306<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"user\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"root\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"password\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"database\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"rambler_test\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"directory\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\".\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"table\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"migrations\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u6742\u611f<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u304cJSON\u3067\u826f\u3044<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30ed\u30b0\u304c\u3068\u3066\u3082\u898b\u306b\u304f\u3044<\/ul>\n<h2>\u8fc1\u79fb\u6587\u4ef6<\/h2>\n<p>\u6ca1\u6709\u521b\u5efa\u539f\u578b\u529f\u80fd\u3002\u6587\u4ef6\u5c06\u4ee5version_description.sql\u7684\u547d\u540d\u89c4\u5219\u521b\u5efa\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">-- rambler up<\/span>\r\n\r\n<span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"nv\">`posts`<\/span> <span class=\"p\">(<\/span>\r\n  <span class=\"nv\">`post_id`<\/span> <span class=\"nb\">INT<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span> <span class=\"n\">AUTO_INCREMENT<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nv\">`author`<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">255<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nv\">`text`<\/span> <span class=\"nb\">TEXT<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span>\r\n<span class=\"p\">)<\/span> <span class=\"n\">ENGINE<\/span> <span class=\"o\">=<\/span> <span class=\"n\">InnoDB<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"c1\">-- rambler down<\/span>\r\n\r\n<span class=\"k\">DROP<\/span> <span class=\"k\">TABLE<\/span> <span class=\"nv\">`posts`<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<h2>\u6307\u4ee4<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>rambler\r\n11:38 debug loading configuration from%!<span class=\"o\">(<\/span>EXTRA <span class=\"nv\">string<\/span><span class=\"o\">=)<\/span>unable to load configuration from file: open : no such file or directory\r\n\r\nNAME:\r\n   rambler - Migrate all the things!\r\n\r\nUSAGE:\r\n   rambler <span class=\"o\">[<\/span>global options] <span class=\"nb\">command<\/span> <span class=\"o\">[<\/span><span class=\"nb\">command <\/span>options] <span class=\"o\">[<\/span>arguments...]\r\n\r\nAUTHOR:\r\n   Romain Baugue &lt;romain.baugue@elwinar.com&gt;\r\n\r\nCOMMANDS:\r\n     apply    apply the next migration\r\n     reverse  reverse the last migration\r\n     <span class=\"nb\">help<\/span>, h  Shows a list of commands or <span class=\"nb\">help <\/span><span class=\"k\">for <\/span>one <span class=\"nb\">command\r\n\r\n<\/span>GLOBAL OPTIONS:\r\n   <span class=\"nt\">--configuration<\/span> value, <span class=\"nt\">-c<\/span> value  path to the configuration file\r\n   <span class=\"nt\">--environment<\/span> value, <span class=\"nt\">-e<\/span> value    <span class=\"nb\">set <\/span>the working environment <span class=\"o\">(<\/span>default: <span class=\"s2\">\"default\"<\/span><span class=\"o\">)<\/span>\r\n   <span class=\"nt\">--debug<\/span>                          display debug messages\r\n   <span class=\"nt\">--help<\/span>, <span class=\"nt\">-h<\/span>                       show <span class=\"nb\">help<\/span>\r\n   <span class=\"nt\">--version<\/span>, <span class=\"nt\">-v<\/span>                    print the version\r\nunable to load configuration from file: open : no such file or directory\r\n<\/code><\/pre>\n<h2>\u7248\u672c\u7ba1\u7406<\/h2>\n<pre class=\"post-pre\"><code><span class=\"o\">&gt;<\/span> <span class=\"k\">select<\/span> <span class=\"o\">*<\/span> <span class=\"k\">from<\/span> <span class=\"n\">migrations<\/span><span class=\"p\">;<\/span>\r\n<span class=\"o\">+<\/span><span class=\"c1\">---------------------+<\/span>\r\n<span class=\"o\">|<\/span> <span class=\"n\">migration<\/span>           <span class=\"o\">|<\/span>\r\n<span class=\"o\">+<\/span><span class=\"c1\">---------------------+<\/span>\r\n<span class=\"o\">|<\/span> <span class=\"mi\">01<\/span><span class=\"n\">_create_posts<\/span><span class=\"p\">.<\/span><span class=\"k\">sql<\/span> <span class=\"o\">|<\/span>\r\n<span class=\"o\">+<\/span><span class=\"c1\">---------------------+<\/span>\r\n<span class=\"mi\">1<\/span> <span class=\"k\">row<\/span> <span class=\"k\">in<\/span> <span class=\"k\">set<\/span> <span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">.<\/span><span class=\"mi\">00<\/span> <span class=\"n\">sec<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<h1>\u95f9\u54ea\u513f\/\u7c73\u8c37<\/h1>\n<p>\u6570\u636e\u5e93\u7ba1\u7406<\/p>\n<ul class=\"post-ul\">MySQL<\/ul>\n<p>\u5b89\u88c5<\/p>\n<pre class=\"post-pre\"><code>go get <span class=\"nt\">-u<\/span> github.com\/naoina\/migu\/cmd\/migu\r\n<\/code><\/pre>\n<p>\u6742\u611f<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u7d30\u304b\u3044\u3053\u3068\u3092\u6c17\u306b\u3057\u306a\u3051\u308c\u3070\u697d\u3061\u3093<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u878d\u901a\u306f\u304d\u304b\u306a\u305d\u3046<\/ul>\n<h2>\u8fc1\u79fb\u6587\u4ef6<\/h2>\n<p>\u6211\u8981\u5199\u4e00\u4e2aGo\u7684struct\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">package<\/span> <span class=\"n\">main<\/span>\r\n\r\n<span class=\"k\">type<\/span> <span class=\"n\">Post<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">PostId<\/span> <span class=\"kt\">int<\/span> <span class=\"s\">`migu:\"pk,autoincrement\"`<\/span>\r\n        <span class=\"n\">Author<\/span> <span class=\"kt\">string<\/span>\r\n        <span class=\"n\">Text<\/span>   <span class=\"kt\">string<\/span> <span class=\"s\">`migu:\"size:65535\"`<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u79fb\u6c11<\/h2>\n<p>\u4ee5\u8fd9\u79cd\u65b9\u5f0f\u4ecestruct\u751f\u6210\u6a21\u5f0f\u5e76\u6267\u884c\u7ed9\u6211\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>migu <span class=\"nb\">sync<\/span> <span class=\"nt\">-u<\/span> root <span class=\"nt\">-h<\/span> 127.0.0.1:3306 migu_test schema.go\r\n<span class=\"nt\">--------applying--------<\/span>\r\n  CREATE TABLE <span class=\"sb\">`<\/span>post<span class=\"sb\">`<\/span> <span class=\"o\">(<\/span>\r\n    <span class=\"sb\">`<\/span>post_id<span class=\"sb\">`<\/span> INT NOT NULL PRIMARY KEY AUTO_INCREMENT,\r\n    <span class=\"sb\">`<\/span>author<span class=\"sb\">`<\/span> VARCHAR<span class=\"o\">(<\/span>255<span class=\"o\">)<\/span> NOT NULL,\r\n    <span class=\"sb\">`<\/span>text<span class=\"sb\">`<\/span> MEDIUMTEXT NOT NULL\r\n  <span class=\"o\">)<\/span>\r\n<span class=\"nt\">--------done<\/span> 0.019s--------\r\n<\/code><\/pre>\n<h2>\u547d\u4ee4<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>migu\r\nmigu: too few arguments\r\nUsage: migu <span class=\"o\">[<\/span>OPTIONS] COMMAND <span class=\"o\">[<\/span>ARG...]\r\n\r\nCommands:\r\n  <span class=\"nb\">sync      <\/span>synchronize the database schema\r\n  dump      dump the database schema as Go code\r\n\r\nOptions:\r\n      <span class=\"nt\">--help<\/span>             Display this <span class=\"nb\">help <\/span>and <span class=\"nb\">exit<\/span>\r\n\r\n<span class=\"nv\">$ <\/span>migu <span class=\"nb\">sync\r\n<\/span>migu: too few arguments\r\nUsage: migu <span class=\"nb\">sync<\/span> <span class=\"o\">[<\/span>OPTIONS] DATABASE <span class=\"o\">[<\/span>FILE]\r\n\r\nOptions:\r\n      <span class=\"nt\">--dry-run<\/span>          Print the results with no changes\r\n  <span class=\"nt\">-q<\/span>, <span class=\"nt\">--quiet<\/span>            Suppress non-error messages\r\n  <span class=\"nt\">-u<\/span>, <span class=\"nt\">--user<\/span><span class=\"o\">=<\/span>NAME        User <span class=\"k\">for <\/span>login to database <span class=\"k\">if <\/span>not current user\r\n  <span class=\"nt\">-h<\/span>, <span class=\"nt\">--host<\/span><span class=\"o\">=<\/span>HOST        Connect to host of database\r\n  <span class=\"nt\">-u<\/span>, <span class=\"nt\">--user<\/span><span class=\"o\">=<\/span>NAME        User <span class=\"k\">for <\/span>login to database <span class=\"k\">if <\/span>not current user\r\n  <span class=\"nt\">-p<\/span>, <span class=\"nt\">--password<\/span><span class=\"o\">[=<\/span>PASS]  Password to use when connecting to server.\r\n                         If password is not given, it<span class=\"s1\">'s asked from the tty\r\n      --help             Display this help and exit\r\n\r\nWith no FILE, or when FILE is -, read standard input.\r\n<\/span><\/code><\/pre>\n<h1>\u6728\u5320\/dev-cloverlab<\/h1>\n<p>\u5bf9\u5e94\u7684\u6570\u636e\u5e93<\/p>\n<ul class=\"post-ul\">MySQL<\/ul>\n<p>\u5b89\u88c5<\/p>\n<pre class=\"post-pre\"><code>go get github.com\/dev-cloverlab\/carpenter\/cmd\/carpenter\r\n<\/code><\/pre>\n<p>\u6df7\u4e71\u7684\u60c5\u7eea<\/p>\n<ul class=\"post-ul\">\u9762\u767d\u3044<\/ul>\n<h2>\u7ffb\u8bd1\uff1a\u6a21\u5f0f\u5bfc\u51fa<\/h2>\n<p>\u6728\u5de5\u5e08\u53ef\u4ee5\u4f7f\u7528\u7279\u6b8a\u5de5\u5177\u6765\u8fdb\u884c\u4ee5\u4e0b\u7684\u4e24\u79cd\u64cd\u4f5c\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u5b9fDB\u306e\u30b9\u30ad\u30fc\u30de\u3092JSON\u3078\u30a8\u30af\u30b9\u30dd\u30fc\u30c8<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">JSON\u306e\u30b9\u30ad\u30fc\u30de\u306b\u3088\u308b\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3<\/ul>\n<p>\u4ee5JSON\u4e3a\u57fa\u7840\u7684\u6a21\u5f0f\u76f8\u5f53\u590d\u6742\uff0c\u4f3c\u4e4e\u4e0d\u9002\u5408\u7531\u4eba\u6765\u7f16\u5199\u3002<\/p>\n<p>\u5bfc\u51fa\u53ef\u4ee5\u4f7f\u7528\u5982\u4e0b\u547d\u4ee4\u5b8c\u6210\u3002<\/p>\n<pre class=\"post-pre\"><code>carpenter <span class=\"nt\">--schema<\/span> goose_test <span class=\"nt\">--data-source<\/span> <span class=\"s1\">'root:@tcp(127.0.0.1:3306)'<\/span> design\r\n<\/code><\/pre>\n<p>\u5c06\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a tables.json \u7684\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>jq <span class=\"s2\">\".\"<\/span> &lt; tables.json | <span class=\"nb\">wc<\/span> <span class=\"nt\">-l<\/span>\r\n     248\r\n<span class=\"nv\">$ <\/span>jq <span class=\"s2\">\".\"<\/span> &lt; tables.json | <span class=\"nb\">head<\/span> <span class=\"nt\">-30<\/span>\r\n<span class=\"o\">[<\/span>\r\n  <span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"TableCatalog\"<\/span>: <span class=\"s2\">\"def\"<\/span>,\r\n    <span class=\"s2\">\"TableSchema\"<\/span>: <span class=\"s2\">\"goose_test\"<\/span>,\r\n    <span class=\"s2\">\"TableName\"<\/span>: <span class=\"s2\">\"goose_db_version\"<\/span>,\r\n    <span class=\"s2\">\"TableType\"<\/span>: <span class=\"s2\">\"BASE TABLE\"<\/span>,\r\n    <span class=\"s2\">\"Engine\"<\/span>: <span class=\"s2\">\"InnoDB\"<\/span>,\r\n    <span class=\"s2\">\"Version\"<\/span>: 10,\r\n    <span class=\"s2\">\"RowFormat\"<\/span>: <span class=\"s2\">\"Compact\"<\/span>,\r\n    <span class=\"s2\">\"TableRows\"<\/span>: 14,\r\n    <span class=\"s2\">\"AvgRowLength\"<\/span>: 1170,\r\n    <span class=\"s2\">\"DataLength\"<\/span>: 16384,\r\n    <span class=\"s2\">\"MaxDataLength\"<\/span>: 0,\r\n    <span class=\"s2\">\"IndexLength\"<\/span>: 16384,\r\n    <span class=\"s2\">\"DataFree\"<\/span>: 0,\r\n    <span class=\"s2\">\"AutoIncrement\"<\/span>: 17,\r\n    <span class=\"s2\">\"TableCollation\"<\/span>: <span class=\"s2\">\"utf8_general_ci\"<\/span>,\r\n    <span class=\"s2\">\"CheckSum\"<\/span>: null,\r\n    <span class=\"s2\">\"CreateOptions\"<\/span>: <span class=\"s2\">\"\"<\/span>,\r\n    <span class=\"s2\">\"TableComment\"<\/span>: <span class=\"s2\">\"\"<\/span>,\r\n    <span class=\"s2\">\"Columns\"<\/span>: <span class=\"o\">[<\/span>\r\n      <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"TableCatalog\"<\/span>: <span class=\"s2\">\"def\"<\/span>,\r\n        <span class=\"s2\">\"TableSchema\"<\/span>: <span class=\"s2\">\"goose_test\"<\/span>,\r\n        <span class=\"s2\">\"TableName\"<\/span>: <span class=\"s2\">\"goose_db_version\"<\/span>,\r\n        <span class=\"s2\">\"ColumnName\"<\/span>: <span class=\"s2\">\"id\"<\/span>,\r\n        <span class=\"s2\">\"OrdinalPosition\"<\/span>: 1,\r\n        <span class=\"s2\">\"ColumnDefault\"<\/span>: null,\r\n        <span class=\"s2\">\"Nullable\"<\/span>: <span class=\"s2\">\"NO\"<\/span>,\r\n        <span class=\"s2\">\"DataType\"<\/span>: <span class=\"s2\">\"bigint\"<\/span>,\r\n<\/code><\/pre>\n<h2>\u79fb\u6c11<\/h2>\n<p>\u5982\u679c\u6709JSON\uff0c\u53ef\u4ee5\u6839\u636e\u5b83\u751f\u6210\u8868\u683c\u3002<\/p>\n<pre class=\"post-pre\"><code>carpenter <span class=\"nt\">--schema<\/span> carpenter_test <span class=\"nt\">--data-source<\/span> <span class=\"s1\">'root:@tcp(127.0.0.1:3306)'<\/span> build <span class=\"nt\">--dir<\/span> <span class=\"nb\">.<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u8868\u5df2\u7ecf\u5b58\u5728\u5e76\u4e14\u6a21\u5f0f\u53d1\u751f\u4e86\u53d8\u5316\uff0c\u5b83\u4f3c\u4e4e\u4f1a\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\u3002<\/p>\n<h2>\u547d\u4ee4<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>carpenter\r\nNAME:\r\n   carpenter - Carpenter is a tool to manage DB schema and data\r\n\r\nUSAGE:\r\n   carpenter <span class=\"o\">[<\/span>global options] <span class=\"nb\">command<\/span> <span class=\"o\">[<\/span><span class=\"nb\">command <\/span>options] <span class=\"o\">[<\/span>arguments...]\r\n\r\nVERSION:\r\n   0.3.1\r\n\r\nAUTHOR:\r\n   hatajoe &lt;hatanaka@cloverlab.jp&gt;\r\n\r\nCOMMANDS:\r\n     design   Export table structure as JSON string\r\n     build    Build<span class=\"o\">(<\/span>Migrate<span class=\"o\">)<\/span> table from specified JSON string\r\n     import   Import CSV to table\r\n     <span class=\"nb\">export   <\/span>Export CSV to table\r\n     <span class=\"nb\">help<\/span>, h  Shows a list of commands or <span class=\"nb\">help <\/span><span class=\"k\">for <\/span>one <span class=\"nb\">command\r\n\r\n<\/span>GLOBAL OPTIONS:\r\n   <span class=\"nt\">--verbose<\/span>, <span class=\"nt\">--vv<\/span>                show verbose output <span class=\"o\">(<\/span>default off<span class=\"o\">)<\/span>\r\n   <span class=\"nt\">--dry-run<\/span>                      execute as dry-run mode <span class=\"o\">(<\/span>default off<span class=\"o\">)<\/span>\r\n   <span class=\"nt\">--schema<\/span> value, <span class=\"nt\">-s<\/span> value       database name <span class=\"o\">(<\/span>required<span class=\"o\">)<\/span>\r\n   <span class=\"nt\">--data-source<\/span> value, <span class=\"nt\">-d<\/span> value  data <span class=\"nb\">source <\/span>name like <span class=\"s1\">'[username[:password]@][tcp[(address:port)]]'<\/span> <span class=\"o\">(<\/span>required<span class=\"o\">)<\/span>\r\n   <span class=\"nt\">--help<\/span>, <span class=\"nt\">-h<\/span>                     show <span class=\"nb\">help<\/span>\r\n   <span class=\"nt\">--version<\/span>, <span class=\"nt\">-v<\/span>                  print the version\r\n<\/code><\/pre>\n<p>\u4f3c\u4e4e\u8fd8\u53ef\u4ee5\u4f7f\u7528CSV\u8fdb\u884c\u5bfc\u5165\/\u5bfc\u51fa\u3002<\/p>\n<h1>\u8bf7\u53c2\u9605<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">DB\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30c4\u30fc\u30eb\u4f5c\u3063\u305f\u8a71<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Go\u88fd\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30c4\u30fc\u30eb\u306e\u73fe\u72b6\u78ba\u8a8d<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u76f8\u5bf9\u6bd4\u8f83 CLI\u3067\u4f7f\u3048\u308b &nbsp; MySQL\u304c\u4f7f\u3048\u308b \u540d\u524dStar\u6570\u30b9\u30ad\u30fc\u30de\u65b9\u5f0fDry Run\u8a2d\u5b9alia [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-50566","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u6574\u7406\u4e86Go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6574\u7406\u4e86go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u6574\u7406\u4e86Go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177\" \/>\n<meta property=\"og:description\" content=\"\u76f8\u5bf9\u6bd4\u8f83 CLI\u3067\u4f7f\u3048\u308b &nbsp; MySQL\u304c\u4f7f\u3048\u308b \u540d\u524dStar\u6570\u30b9\u30ad\u30fc\u30de\u65b9\u5f0fDry Run\u8a2d\u5b9alia [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6574\u7406\u4e86go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-02T16:10:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T07:43:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d9257913a08637a6e2394\/34-0.png\" \/>\n<meta name=\"author\" content=\"\u97f5, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u97f5, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/\",\"name\":\"\u6574\u7406\u4e86Go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-03-02T16:10:05+00:00\",\"dateModified\":\"2024-05-04T07:43:59+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u6574\u7406\u4e86Go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e\",\"name\":\"\u97f5, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g\",\"caption\":\"\u97f5, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunke\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u6574\u7406\u4e86Go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u6574\u7406\u4e86go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177\/","og_locale":"zh_CN","og_type":"article","og_title":"\u6574\u7406\u4e86Go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177","og_description":"\u76f8\u5bf9\u6bd4\u8f83 CLI\u3067\u4f7f\u3048\u308b &nbsp; MySQL\u304c\u4f7f\u3048\u308b \u540d\u524dStar\u6570\u30b9\u30ad\u30fc\u30de\u65b9\u5f0fDry Run\u8a2d\u5b9alia [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u6574\u7406\u4e86go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-03-02T16:10:05+00:00","article_modified_time":"2024-05-04T07:43:59+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d9257913a08637a6e2394\/34-0.png"}],"author":"\u97f5, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u97f5, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/","name":"\u6574\u7406\u4e86Go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-03-02T16:10:05+00:00","dateModified":"2024-05-04T07:43:59+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u6574\u7406\u4e86Go\u5236\u4f5c\u7684\u8fc1\u79fb\u5de5\u5177"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e","name":"\u97f5, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g","caption":"\u97f5, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunke\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%95%b4%e7%90%86%e4%ba%86go%e5%88%b6%e4%bd%9c%e7%9a%84%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=50566"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50566\/revisions"}],"predecessor-version":[{"id":99215,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50566\/revisions\/99215"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=50566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=50566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=50566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}