{"id":364035,"date":"2024-05-21T02:08:49","date_gmt":"2024-05-21T02:08:49","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=364035"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-21T02:08:49","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=364035","title":{"rendered":"<span>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0432 YDB \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u00abgoose\u00bb<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041b\u044e\u0431\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u0435\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 &#8212; \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043e \u0434\u0440\u0443\u0433\u043e\u0439 (\u043e\u0431\u044b\u0447\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u043e\u0439) [<a href=\"https:\/\/habr.com\/ru\/articles\/121265\/\">\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/a>].<\/p>\n<p>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0432 \u0411\u0414 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438). \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e\u0431 \u0443\u0442\u0438\u043b\u0438\u0442\u0435\u00a0<a href=\"https:\/\/github.com\/pressly\/goose\">goose<\/a>. \u042d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0441\u0445\u0435\u043c\u044b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438\u00a0<a href=\"https:\/\/github.com\/pressly\/goose\/releases\/tag\/v3.16.0\">v3.16.0<\/a>\u00a0goose \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u00a0<a href=\"https:\/\/ydb.tech\/\">YDB<\/a>\u00a0&#8212; \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e open-source \u0421\u0423\u0411\u0414. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0435\u0439\u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 YDB.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9d0\/7e8\/5d9\/9d07e85d9ab1436d308f697b48854c97.png\" width=\"1100\" height=\"562\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9d0\/7e8\/5d9\/9d07e85d9ab1436d308f697b48854c97.png\"\/><\/figure>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 &#171;\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u0445\u0435\u043c\u044b&#187;?<\/h3>\n<p>\u041f\u043e\u0434\u00a0<strong>\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f\u043c\u0438<\/strong>\u00a0\u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u043d\u044f\u0442\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f &#8212; \u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0430\u043c\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 PostgreSQL \u0432 Oracle.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f &#8212; \u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0430\u043c\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f PostgreSQL \u0441 \u043c\u0430\u0441\u0442\u0435\u0440-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0410 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440-\u0444\u043e\u043b\u043b\u043e\u0432\u0435\u0440 \u0411. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0435\u0449\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u00a0<em>\u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439<\/em>.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f &#8212; \u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0439 \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0430\u043c\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 PostgreSQL \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0431\u0435\u0437 \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043a \u0432\u0435\u0440\u0441\u0438\u0438 \u0441 \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u00a0<strong><em>\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/em><\/strong>\u00a0\u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00a0<strong><em>\u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438<\/em><\/strong>\u00a0\u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u043c-\u0442\u043e \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0442\u0435\u0440\u043f\u0435\u0432\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0418 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u0441\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u0433\u0438\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043e\u043d\u043b\u0430\u0439\u043d-\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &#171;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Schema_migration\">\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u0445\u0435\u043c\u044b<\/a>&#171;.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0435\u0449\u0435 \u043d\u0435 \u0432\u044b\u0440\u043e\u0441 \u0438\u0437 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430, \u043c\u043e\u0436\u043d\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u0441\u0445\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0430\u043a\u0430\u0442\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0440\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0432 \u043d\u043e\u0432\u0443\u044e. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u041d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u0442\u0430\u043f\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0411\u0414 \u0438 \u0440\u0435\u043b\u0438\u0437\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0440\u0443\u044e \u0438\u043b\u0438 \u043d\u043e\u0432\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<h3>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430<\/h3>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 &#8212; \u0430\u0434\u043c\u0438\u043d\u043a\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u041e\u0431\u044b\u0447\u043d\u043e\u0435\u00a0<em>CRUD<\/em>-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u043e \u0437\u0430\u0434\u0443\u043c\u043a\u0435 \u044d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>\u041f\u0443\u0441\u0442\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u0440\u043e\u0442\u0435\u043a\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438:\u00a0<code>id<\/code>\u00a0(\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u0438),\u00a0<code>username<\/code>\u00a0(\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f) \u0438\u00a0<code>created_at<\/code>\u00a0(\u0434\u0430\u0442\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438). \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0432\u044f\u0437\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0438\u0445 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (Bob Smith, Dow Jones, John Dow, Elon Mask).<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0441\u043f\u0440\u0438\u043d\u0442\u0435 \u043c\u044b \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u043f\u043e\u043d\u044f\u0442\u0438\u044e \u0440\u043e\u043b\u0435\u0439. \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0440\u043e\u043b\u0435\u0439 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438:\u00a0<code>id<\/code>\u00a0(\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u0438) \u0438\u00a0<code>name<\/code>\u00a0(\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0440\u043e\u043b\u0438). \u0421\u0440\u0430\u0437\u0443 \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0440\u043e\u043b\u0438\u00a0<code>admin<\/code>,\u00a0<code>viewer<\/code>,\u00a0<code>guest<\/code>. \u041d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0440\u043e\u043b\u0438\u00a0<code>role_id<\/code>. \u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0437\u043c\u0435\u0442\u0438\u0442\u044c \u0440\u043e\u043b\u044f\u043c\u0438. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0440\u043e\u043b\u044c\u00a0<code>guest<\/code>\u00a0\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0430\u0434\u043c\u0438\u043d\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u043e\u043b\u044c.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043e\u0441\u043e\u0437\u043d\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0441\u0447\u0435\u0442 &#8212; \u0443\u0447\u0451\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b. \u041c\u044b \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c (\u0445\u044d\u0448), \u0447\u0442\u043e\u0431\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u0441\u00a0<code>password_hash<\/code>\u00a0\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0410 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0435\u0437\u0434\u0435\u00a0<em>middleware<\/em>, \u0447\u0442\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043d\u0430\u0441 \u043d\u0430\u0431\u0440\u0430\u043b\u043e\u0441\u044c \u0443\u0436\u0435 \u043d\u0435\u043c\u0430\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438, \u0447\u0442\u043e \u0432 \u0442\u043e\u043f\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439\u00a0<code>WHERE username=\u2026 AND password_hash=\u2026<\/code>\u00a0\u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043d\u0430 \u043f\u043e\u043b\u044f\u00a0<code>password_hash<\/code>. \u0412 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430 \u044d\u0442\u043e \u043f\u043e\u043b\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435 (\u0432\u0441\u0435 \u043a\u0430\u043a \u0432 \u0436\u0438\u0437\u043d\u0438)<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0440\u0430\u0441\u043d\u043e\u0440\u0435\u0447\u0438\u0432\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u044d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438.<\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 &#171;goose&#187;?<\/h3>\n<p>Goose &#8212; \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u041e\u043d \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Go, \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e &#171;go get&#187; \u0438\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.<\/p>\n<pre><code class=\"bash\">$ go install github.com\/pressly\/goose\/v3\/cmd\/goose@latest<\/code><\/pre>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 goose:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/pressly\/goose\">github.com\/pressly\/goose\u00a0<\/a>(\u0444\u043e\u0440\u043a \u0430\u043f\u0441\u0442\u0440\u0438\u043c\u0430)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/bitbucket.org\/liamstask\/goose\">bitbucket.org\/liamstask\/goose<\/a>\u00a0(\u0430\u043f\u0441\u0442\u0440\u0438\u043c)<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043a\u00a0<a href=\"https:\/\/github.com\/pressly\/goose\">github.com\/pressly\/goose<\/a>, \u0442.\u043a. \u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0448\u0430\u0433\u043d\u0443\u043b\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u0432\u043f\u0435\u0440\u0435\u0434 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0430\u043f\u0441\u0442\u0440\u0438\u043c\u043e\u043c. \u0422\u0430\u043a\u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 YDB \u0432 goose \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u0441\u0442\u0430\u043b\u0430 \u043e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438\u00a0<a href=\"https:\/\/github.com\/pressly\/goose\/releases\/tag\/v3.16.0\">v3.16.0<\/a>.<\/p>\n<h3>\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u043d\u043a\u0438 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439<\/h3>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u043f\u0430\u0441\u0430\u0442\u044c\u0441\u044f \u0433\u043e\u043d\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u043c\u0438 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 (\u043d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0430\u043c\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0438\u043b\u0438 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u044b\u0445). \u041a\u043e\u0433\u0434\u0430 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 &#8212; \u0438\u043c\u0435\u044e\u0442 \u0432 \u0432\u0438\u0434\u0443 \u0442\u043e, \u0447\u0442\u043e \u0441 \u044d\u0442\u043e\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e-\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445). \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442\u0435 \u0441\u0432\u043e\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 500 \u043c\u0430\u0448\u0438\u043d\u0430\u0445. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438. \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 500 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u0445\u043e\u0442\u044f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u00a0<code>CREATE TABLE<\/code>\u00a0\u0438\u043b\u0438\u00a0<code>ALTER TABLE<\/code>? \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e \u0438\u043b\u0438 499 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0432\u0430\u0448\u0435\u0433\u043e \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0442.\u043a. \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u043d\u0438\u0445 \u201c\u0432\u044b\u0438\u0433\u0440\u0430\u0435\u0442\u201d \u0432 \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0439 \u0433\u043e\u043d\u043a\u0435. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0433\u043e\u043d\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u044f\u0432\u043d\u044b\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u0430\u043f\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<code>{Dev,DB}OPS<\/code>\u00a0&#8212; \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435).<\/p>\n<\/li>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432\u00a0<code>leader election<\/code>\u00a0\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u043c\u0430\u0444\u043e\u0440\u0430. \u0412 YDB \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 (<code>coordination service<\/code>), \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0434\u0435\u043b\u0430\u0442\u044c\u00a0<code>leader election<\/code>\u00a0\u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u0435 goose \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 YDB \u044d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0433\u043e\u043d\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c YDB \u0432 \u0434\u043e\u043a\u0435\u0440-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 (\u0441\u043c.\u00a0<a href=\"https:\/\/ydb.tech\/docs\/en\/getting_started\/quickstart\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a>\u00a0YDB):<\/p>\n<pre><code class=\"bash\">$ docker run -d --rm --name ydb-local -h localhost \\ -p 2135:2135 -p 2136:2136 -p 8765:8765 \\ -v $(pwd)\/ydb_certs:\/ydb_certs -v $(pwd)\/ydb_data:\/ydb_data \\   -e GRPC_TLS_PORT=2135 -e GRPC_PORT=2136 -e MON_PORT=8765 \\   ghcr.io\/ydb-platform\/local-ydb:23.3<\/code><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e goose \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 YDB \u043d\u0435 \u043d\u0438\u0436\u0435 23-3.<\/p>\n<h2>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a YDB \u0438\u0437 goose \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0430\u00a0<code>grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric<\/code>.<\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><code>grpc<\/code>\u00a0&#8212; \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e insecure \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e gRPC. \u0414\u043b\u044f \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u0441 TLS) \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u00a0<code>grpcs<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u044f\u0432\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\u00a0<code>$(pwd)\/ydb_certs<\/code>, \u00a0\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:\u00a0<code>export YDB_SSL_ROOT_CERTIFICATES_FILE=$(pwd)\/ydb_certs<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>localhost<\/code>\u00a0&#8212; \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a YDB.<\/p>\n<\/li>\n<li>\n<p><code>2136<\/code>\u00a0&#8212; \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 YDB \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e insecure \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443. \u0414\u043b\u044f \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0438\u043d\u043e\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 YDB) \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u0442\u00a0<code>2135<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u044f\u0432\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438\u0437\u00a0\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\u00a0<code>$(pwd)\/ydb_certs<\/code>, \u00a0\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:\u00a0<code>export YDB_SSL_ROOT_CERTIFICATES_FILE=$(pwd)\/ydb_certs<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>local<\/code>\u00a0&#8212; \u0438\u043c\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 YDB.<\/p>\n<\/li>\n<li>\n<p><code>go_query_mode=scripting<\/code>\u00a0&#8212; \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c\u00a0<code>scripting<\/code>\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 YDB. \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0442 goose \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 YDB \u0441\u0435\u0440\u0432\u0438\u0441\u00a0<code>scripting<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a DDL, \u0442\u0430\u043a \u0438 DML \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 SQL.<\/p>\n<\/li>\n<li>\n<p><code>go_fake_tx=scripting<\/code>\u00a0&#8212; \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0438\u0441 YDB\u00a0<code>scripting<\/code>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 YDB \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 DDL \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 SQL \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e (\u0438\u043b\u0438 \u043d\u0435\u0441\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b). \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u00a0<code>scripting<\/code>\u00a0\u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 (\u0441 \u044f\u0432\u043d\u044b\u043c\u0438 <code>Begin<\/code>+<code>Commit<\/code>\/<code>Rollback<\/code>). \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0440\u0435\u0436\u0438\u043c \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u043d\u0430 \u0434\u0435\u043b\u0435 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e (nop) \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u0430\u0445 <code>Begin<\/code>+<code>Commit<\/code>\/<code>Rollback<\/code> \u0438\u0437 goose. \u042d\u0442\u043e\u0442 \u0442\u0440\u044e\u043a \u0432 \u0440\u0435\u0434\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 YDB \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043d\u043e\u0432\u044b\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c\u00a0<code>query<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043c\u043e\u0447\u044c \u0443\u0431\u0440\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0438\u0441\u043a.<\/p>\n<\/li>\n<li>\n<p><code>go_query_bind=declare,numeric<\/code>\u00a0&#8212; \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u043e\u0432 \u0430\u0432\u0442\u043e-\u0432\u044b\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 YQL \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (<code>declare<\/code>) \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u043e\u0432 \u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 (<code>numeric<\/code>). \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e YQL &#8212; \u044f\u0437\u044b\u043a \u0441\u043e \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0439 \u044f\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0442\u0435\u043b\u0435 \u0441\u0430\u043c\u043e\u0433\u043e SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438\u00a0<code>DECLARE<\/code>. \u0422\u0430\u043a\u0436\u0435 YQL \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0<code>$my_arg<\/code>), \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u044f\u0434\u0440\u043e goose \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 (<code>$1<\/code>, <code>$2<\/code> \u0438 \u0442.\u0434.). \u0411\u0438\u043d\u0434\u0438\u043d\u0433\u0438\u00a0<code>declare<\/code>\u00a0\u0438\u00a0<code>numeric<\/code>\u00a0\u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437 goose \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 YDB, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u0432 goose. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0430\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/companies\/ydb\/articles\/747490\/\">database\/sql \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u0434\u043b\u044f YDB \u0432 Go<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00a0<em>goose<\/em>\u00a0\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a YDB, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f\u00a0<a href=\"https:\/\/ydb.tech\/docs\/en\/reference\/ydb-sdk\/recipes\/auth-anonymous\">anonymous credentials<\/a>. \u0427\u0435\u0440\u0435\u0437 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:<\/p>\n<ul>\n<li>\n<p>\u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a YDB \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<a href=\"https:\/\/ydb.tech\/docs\/en\/reference\/ydb-sdk\/recipes\/auth-static\">static credentials<\/a>\u00a0\u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (<code>login<\/code>\u00a0\u0438\u00a0<code>password<\/code>):\u00a0<code>grpc:\/\/login:password@localhost:2136\/local?...<\/code>\u00a0.<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a YDB \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<a href=\"https:\/\/ydb.tech\/docs\/en\/reference\/ydb-sdk\/recipes\/auth-access-token\">\u0442\u043e\u043a\u0435\u043d\u0430<\/a>\u00a0\u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440:\u00a0<code>grpc:\/\/localhost:2136\/local?token=&lt;ACCESS_TOKEN>&amp;...<\/code>\u00a0.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 YDB \u0438\u0437 <em>goose<\/em> \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f.<\/p>\n<h4>\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439<\/h4>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e\u00a0<code>migrations<\/code>\u00a0\u0438 \u0434\u0430\u043b\u0435\u0435 \u0432\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 \u044d\u0442\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438:<\/p>\n<pre><code class=\"bash\">$ mkdir migrations &amp;&amp; cd migrations<\/code><\/pre>\n<h3>\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b goose \u0441 SQL-\u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b goose \u0441 SQL-\u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439<\/h3>\n<h2>\u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b\u00a0<code>goose create<\/code>:<\/p>\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" create 00001_create_first_table sql 2023\/12\/15 05:22:48 Created new file: 20231215052248_00001_create_table_users.sql<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043b \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438\u00a0<code>&lt;timestamp>_00001_create_table_users.sql<\/code>, \u0433\u0434\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0448\u0430\u0433\u0438 \u043f\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0441\u0445\u0435\u043c\u044b \u0434\u043b\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 YDB, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b\u00a0<code>goose create<\/code>\u00a0\u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0444\u0430\u0439\u043b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438\u00a0<code>&lt;timestamp>_00001_create_table_users.sql<\/code>\u00a0\u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code class=\"sql\">-- +goose Up -- +goose StatementBegin SELECT 'up SQL query'; -- +goose StatementEnd -- +goose Down -- +goose StatementBegin SELECT 'down SQL query'; -- +goose StatementEnd<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0444\u0430\u0439\u043b\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0449\u0438\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u0430\u043a\u0436\u0435 \u043b\u0435\u0433\u043a\u043e, \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u044f\u0441\u044c \u043d\u0430 \u043b\u0438\u0448\u043d\u0435\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0424\u0430\u0439\u043b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432. \u041f\u0435\u0440\u0432\u044b\u0439 &#8212;\u00a0<code>+goose Up<\/code>, \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0448\u0430\u0433\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438. \u0412\u0442\u043e\u0440\u0430\u044f &#8212;\u00a0<code>+goose Down<\/code>, \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0448\u0430\u0433 \u0434\u043b\u044f \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0448\u0430\u0433\u043e\u0432\u00a0<code>+goose Up<\/code>. <em>Goose<\/em> \u0437\u0430\u0431\u043e\u0442\u043b\u0438\u0432\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u043b \u0437\u0430\u043f\u0440\u043e\u0441\u044b-\u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u044b:<\/p>\n<pre><code class=\"sql\">SELECT 'up SQL query';<\/code><\/pre>\n<p>\u0438<\/p>\n<pre><code class=\"sql\">SELECT 'down SQL query';<\/code><\/pre>\n<p>\u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0438\u0445 \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438. \u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438\u00a0<code>&lt;timestamp>_00001_create_table_users.sql<\/code>\u00a0\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0443\u0436\u043d\u043e\u0439 \u043d\u0430\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0430 \u043f\u0440\u0438 \u043e\u0442\u043a\u0430\u0442\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 &#8212; \u043c\u044b \u0443\u0434\u0430\u043b\u044f\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443:<\/p>\n<pre><code class=\"sql\">-- +goose Up -- +goose StatementBegin CREATE TABLE users ( id Uint64, username Text, created_at TzDatetime, PRIMARY KEY (id) ); -- +goose StatementEnd -- +goose Down -- +goose StatementBegin DROP TABLE users; -- +goose StatementEnd<\/code><\/pre>\n<p>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u00a0<code>CREATE TABLE<\/code>\u00a0\u0432 YQL \u043e\u043f\u0438\u0441\u0430\u043d \u0432\u00a0<a href=\"https:\/\/ydb.tech\/en\/docs\/yql\/reference\/syntax\/create_table\">\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u0436\u0435 \u0448\u0430\u0433\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\u00a0<code>users<\/code>\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438:<\/p>\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" create 00002_upsert_test_users sql 2023\/12\/15 05:24:32 Created new file: 20231215052432_00002_upsert_test_users.sql<\/code><\/pre>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430\u00a0<code>&lt;timestamp>_00002_upsert_test_users.sql<\/code>\u00a0\u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"sql\">-- +goose Up -- +goose StatementBegin UPSERT INTO users (id, username, created_at) VALUES (1, 'Bob Smith', CAST('2023-12-01T15:14:13Z' AS Datetime)), (2, 'Dow Jones', CAST('2023-12-02T12:11:10Z' AS Datetime)), (3, 'Elon Mask', CAST('2023-12-03T09:08:07Z' AS Datetime)), (4, 'John Dow', CAST('2023-12-04T06:05:04Z' AS Datetime)); -- +goose StatementEnd -- +goose Down -- +goose StatementBegin DELETE FROM users WHERE id in (1, 2, 3, 4); -- +goose StatementEnd<\/code><\/pre>\n<p>\u041c\u044b \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b\u0438 \u044d\u0442\u0430\u043f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 2 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438: DDL \u0438 DML. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 YDB \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u0442\u0438\u043f\u0430\u043c &#8212; \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\u00a0<code>users<\/code>\u00a0(DDL), \u0437\u0430\u0442\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (DML).<\/p>\n<h2>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0448\u0430\u0433\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439<\/h2>\n<p>\u041d\u043e \u043c\u044b \u043f\u0440\u043e\u0448\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0444\u0430\u0439\u043b\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 \u0434\u043b\u044f:<\/p>\n<details class=\"spoiler\">\n<summary>\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u043e\u043b\u0435\u0439<\/summary>\n<div class=\"spoiler__content\">\n<p>C\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" create 00003_create_table_roles sql 2023\/12\/15 05:38:47 Created new file: 20231215053847_00003_create_table_roles.sql<\/code><\/pre>\n<p>\u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"sql\">-- +goose Up -- +goose StatementBegin CREATE TABLE roles ( id Uint64, name Text, PRIMARY KEY (id) ); -- +goose StatementEnd -- +goose Down -- +goose StatementBegin DROP TABLE roles; -- +goose StatementEnd<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u043e\u043b\u0435\u0439<\/summary>\n<div class=\"spoiler__content\">\n<p>C\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" create 00004_upsert_initial_roles sql 2023\/12\/15 05:38:54 Created new file: 20231215053854_00004_upsert_initial_roles.sql<\/code><\/pre>\n<p>\u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"sql\">-- +goose Up -- +goose StatementBegin UPSERT INTO roles (id, name) VALUES (1, 'admin'), (2, 'viewer'), (3, 'guest'); -- +goose StatementEnd  -- +goose Down -- +goose StatementBegin DELETE FROM roles WHERE id in (1, 2, 3); -- +goose StatementEnd<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043e\u043d\u043a\u0438 role_id \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/summary>\n<div class=\"spoiler__content\">\n<p>C\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" create 00005_add_column_role_id_into_table_users sql 2023\/12\/15 05:39:28 Created new file: 20231215053928_00005_add_column_role_id_into_table_users.sql<\/code><\/pre>\n<p>\u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"sql\">-- +goose Up -- +goose StatementBegin ALTER TABLE users ADD COLUMN role_id Uint64; -- +goose StatementEnd  -- +goose Down -- +goose StatementBegin ALTER TABLE users DROP COLUMN role_id; -- +goose StatementEnd<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u043e\u043b\u0435\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/summary>\n<div class=\"spoiler__content\">\n<p>C\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" create 00006_update_role_id_of_test_users sql 2023\/12\/15 05:40:03 Created new file: 20231215054003_00006_update_role_id_of_test_users.sql<\/code><\/pre>\n<p>\u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"sql\">-- +goose Up -- +goose StatementBegin UPDATE users SET role_id=1 WHERE id=1; UPDATE users SET role_id=2 WHERE id=2; UPDATE users SET role_id=3 WHERE id=3; UPDATE users SET role_id=1 WHERE id=1; UPDATE users SET role_id=3 WHERE id NOT IN (1, 2, 3, 4); -- +goose StatementEnd  -- +goose Down -- +goose StatementBegin UPDATE users SET role_id=NULL; -- +goose StatementEnd<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f password_hash \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/summary>\n<div class=\"spoiler__content\">\n<p>C\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" create 00007_add_column_password_hash_into_table_users sql 2023\/12\/15 05:38:54 Created new file: 20231215054033_00007_add_column_password_hash_into_table_users.sql<\/code><\/pre>\n<p>\u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"sql\">-- +goose Up -- +goose StatementBegin ALTER TABLE users ADD COLUMN password_hash Text; -- +goose StatementEnd  -- +goose Down -- +goose StatementBegin ALTER TABLE users DROP COLUMN password_hash; -- +goose StatementEnd<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043f\u043e \u043a\u043e\u043b\u043e\u043d\u043a\u0435 password_hash \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/summary>\n<div class=\"spoiler__content\">\n<p>C\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" create 00008_add_index_password_hash_on_table_users sql 2023\/12\/15 05:41:02 Created new file: 20231215054102_00008_add_index_password_hash_on_table_users.sql<\/code><\/pre>\n<p>\u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"sql\">-- +goose Up -- +goose StatementBegin ALTER TABLE users ADD INDEX idx_users_password_hash GLOBAL ON (password_hash); -- +goose StatementEnd  -- +goose Down -- +goose StatementBegin ALTER TABLE users DROP INDEX idx_users_password_hash; -- +goose StatementEnd<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043c\u0435\u043d\u044f\u0435\u043c \u0441\u0445\u0435\u043c\u0443, \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0438\u0445 \u0432 \u043e\u0434\u043d\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435. \u0412\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438? \u042d\u0442\u043e \u0432\u0435\u0440\u043d\u043e, \u0438 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0438\u0431\u043e \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0445\u0435\u043c\u043e\u0439, \u043b\u0438\u0431\u043e \u0441\u043e \u0441\u0445\u0435\u043c\u043e\u0439 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. <br \/>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>migrations<\/code> \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c SQL-\u0444\u0430\u0439\u043b\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439:<\/p>\n<pre><code>$ ls . 20231215052248_00001_create_table_users.sql 20231215052432_00002_upsert_test_users.sql 20231215053847_00003_create_table_roles.sql 20231215053854_00004_upsert_initial_roles.sql 20231215053928_00005_add_column_role_id_into_table_users.sql 20231215054003_00006_update_role_id_of_test_users.sql 20231215054033_00007_add_column_password_hash_into_table_users.sql 20231215054102_00008_add_index_password_hash_on_table_users.sql<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438, \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c <code>goose<\/code>:<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043c\u0435\u043d\u044f\u0435\u043c \u0441\u0445\u0435\u043c\u0443, \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0438\u0445 \u0432 \u043e\u0434\u043d\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435. \u0412\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438? \u042d\u0442\u043e \u0432\u0435\u0440\u043d\u043e, \u0438 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0438\u0431\u043e \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0445\u0435\u043c\u043e\u0439, \u043b\u0438\u0431\u043e \u0441\u043e \u0441\u0445\u0435\u043c\u043e\u0439 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. <br \/>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>migrations<\/code> \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c SQL-\u0444\u0430\u0439\u043b\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439:<\/p>\n<pre><code class=\"bash\">$ ls . 20231215052248_00001_create_table_users.sql 20231215052432_00002_upsert_test_users.sql 20231215053847_00003_create_table_roles.sql 20231215053854_00004_upsert_initial_roles.sql 20231215053928_00005_add_column_role_id_into_table_users.sql 20231215054003_00006_update_role_id_of_test_users.sql 20231215054033_00007_add_column_password_hash_into_table_users.sql 20231215054102_00008_add_index_password_hash_on_table_users.sql<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438, \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c <code>goose<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 (goose up)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" up 2023\/12\/15 05:59:55 OK   20231215052248_00001_create_table_users.sql (68.32ms) 2023\/12\/15 05:59:55 OK   20231215052432_00002_upsert_test_users.sql (47.47ms) 2023\/12\/15 05:59:55 OK   20231215053847_00003_create_table_roles.sql (72.54ms) 2023\/12\/15 05:59:55 OK   20231215053854_00004_upsert_initial_roles.sql (42.19ms) 2023\/12\/15 05:59:55 OK   20231215053928_00005_add_column_role_id_into_table_users.sql (56.82ms) 2023\/12\/15 05:59:55 OK   20231215054003_00006_update_role_id_of_test_users.sql (90.8ms) 2023\/12\/15 05:59:55 OK   20231215054033_00007_add_column_password_hash_into_table_users.sql (58ms) 2023\/12\/15 05:59:55 OK   20231215054102_00008_add_index_password_hash_on_table_users.sql (209.6ms) 2023\/12\/15 05:59:55 goose: successfully migrated database to version: 20231215054102<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041e\u0442\u043a\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 (goose reset)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" reset 2023\/12\/15 06:00:16 OK   20231215054102_00008_add_index_password_hash_on_table_users.sql (58.82ms) 2023\/12\/15 06:00:16 OK   20231215054033_00007_add_column_password_hash_into_table_users.sql (46.08ms) 2023\/12\/15 06:00:16 OK   20231215054003_00006_update_role_id_of_test_users.sql (36.02ms) 2023\/12\/15 06:00:16 OK   20231215053928_00005_add_column_role_id_into_table_users.sql (48.9ms) 2023\/12\/15 06:00:16 OK   20231215053854_00004_upsert_initial_roles.sql (46.55ms) 2023\/12\/15 06:00:16 OK   20231215053847_00003_create_table_roles.sql (60.72ms) 2023\/12\/15 06:00:16 OK   20231215052432_00002_upsert_test_users.sql (25.2ms) 2023\/12\/15 06:00:16 OK   20231215052248_00001_create_table_users.sql (84.94ms)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e (goose up-by-one)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" up-by-one 2023\/12\/15 06:00:38 OK   20231215052248_00001_create_table_users.sql (63.62ms)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e (goose up-by-one)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" up-by-one 2023\/12\/15 06:00:51 OK   20231215052432_00002_upsert_test_users.sql (46.38ms)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0418 \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 (goose up-by-one)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" up-by-one 2023\/12\/15 06:01:03 OK   20231215053847_00003_create_table_roles.sql (60.55ms)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0435\u0440\u0435\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e (goose redo)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" redo 2023\/12\/15 06:01:16 OK   20231215053847_00003_create_table_roles.sql (50.72ms) 2023\/12\/15 06:01:16 OK   20231215053847_00003_create_table_roles.sql (66.41ms)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0423\u0437\u043d\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 (goose status)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" status 2023\/12\/15 06:01:31     Applied At                  Migration 2023\/12\/15 06:01:31     ======================================= 2023\/12\/15 06:01:31     Fri Dec 15 06:00:38 2023 -- 20231215052248_00001_create_table_users.sql 2023\/12\/15 06:01:31     Fri Dec 15 06:00:51 2023 -- 20231215052432_00002_upsert_test_users.sql 2023\/12\/15 06:01:31     Fri Dec 15 06:01:16 2023 -- 20231215053847_00003_create_table_roles.sql 2023\/12\/15 06:01:31     Pending                  -- 20231215053854_00004_upsert_initial_roles.sql 2023\/12\/15 06:01:31     Pending                  -- 20231215053928_00005_add_column_role_id_into_table_users.sql 2023\/12\/15 06:01:31     Pending                  -- 20231215054003_00006_update_role_id_of_test_users.sql 2023\/12\/15 06:01:31     Pending                  -- 20231215054033_00007_add_column_password_hash_into_table_users.sql 2023\/12\/15 06:01:31     Pending                  -- 20231215054102_00008_add_index_password_hash_on_table_users.sql<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041e\u0442\u043a\u0430\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e (goose down)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" down 2023\/12\/15 06:01:49 OK   20231215053847_00003_create_table_roles.sql (48.58ms)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 (\u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f) (goose status)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" status 2023\/12\/15 06:02:02     Applied At                  Migration 2023\/12\/15 06:02:02     ======================================= 2023\/12\/15 06:02:02     Fri Dec 15 06:00:38 2023 -- 20231215052248_00001_create_table_users.sql 2023\/12\/15 06:02:02     Fri Dec 15 06:00:51 2023 -- 20231215052432_00002_upsert_test_users.sql 2023\/12\/15 06:02:02     Pending                  -- 20231215053847_00003_create_table_roles.sql 2023\/12\/15 06:02:02     Pending                  -- 20231215053854_00004_upsert_initial_roles.sql 2023\/12\/15 06:02:02     Pending                  -- 20231215053928_00005_add_column_role_id_into_table_users.sql 2023\/12\/15 06:02:02     Pending                  -- 20231215054003_00006_update_role_id_of_test_users.sql 2023\/12\/15 06:02:02     Pending                  -- 20231215054033_00007_add_column_password_hash_into_table_users.sql 2023\/12\/15 06:02:02     Pending                  -- 20231215054102_00008_add_index_password_hash_on_table_users.sql<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 (goose up)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" up 2023\/12\/15 06:02:37 OK   20231215053847_00003_create_table_roles.sql (62.95ms) 2023\/12\/15 06:02:37 OK   20231215053854_00004_upsert_initial_roles.sql (44.33ms) 2023\/12\/15 06:02:37 OK   20231215053928_00005_add_column_role_id_into_table_users.sql (66.65ms) 2023\/12\/15 06:02:37 OK   20231215054003_00006_update_role_id_of_test_users.sql (109.95ms) 2023\/12\/15 06:02:37 OK   20231215054033_00007_add_column_password_hash_into_table_users.sql (56.46ms) 2023\/12\/15 06:02:37 OK   20231215054102_00008_add_index_password_hash_on_table_users.sql (185.34ms) 2023\/12\/15 06:02:37 goose: successfully migrated database to version: 20231215054102<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 (\u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c) (goose status)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ goose ydb \"grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric\" status 2023\/12\/15 06:02:52     Applied At                  Migration 2023\/12\/15 06:02:52     ======================================= 2023\/12\/15 06:02:52     Fri Dec 15 06:00:38 2023 -- 20231215052248_00001_create_table_users.sql 2023\/12\/15 06:02:52     Fri Dec 15 06:00:51 2023 -- 20231215052432_00002_upsert_test_users.sql 2023\/12\/15 06:02:52     Fri Dec 15 06:02:37 2023 -- 20231215053847_00003_create_table_roles.sql 2023\/12\/15 06:02:52     Fri Dec 15 06:02:37 2023 -- 20231215053854_00004_upsert_initial_roles.sql 2023\/12\/15 06:02:52     Fri Dec 15 06:02:37 2023 -- 20231215053928_00005_add_column_role_id_into_table_users.sql 2023\/12\/15 06:02:52     Fri Dec 15 06:02:37 2023 -- 20231215054003_00006_update_role_id_of_test_users.sql 2023\/12\/15 06:02:52     Fri Dec 15 06:02:37 2023 -- 20231215054033_00007_add_column_password_hash_into_table_users.sql 2023\/12\/15 06:02:52     Fri Dec 15 06:02:37 2023 -- 20231215054102_00008_add_index_password_hash_on_table_users.sql<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u0443\u044e \u0441\u043f\u0440\u0430\u0432\u043a\u0443 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c <code>goose<\/code> \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <code>goose<\/code>.<\/p>\n<h3>\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b goose \u0438\u0437 Go-\u043a\u043e\u0434\u0430<\/h3>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0448\u0430\u0433\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 SQL, \u043d\u043e \u0438 \u0438\u0437 Go. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445:<\/p>\n<ul>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432\u0430\u0448\u0435\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u044d\u0442\u0430\u043f\u0430 \u0441\u0442\u0430\u0440\u0442\u0430 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0411\u0414 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p><em>Goose<\/em> \u0438 \u043f\u0430\u043a\u0435\u0442 <em>embed<\/em> \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Go \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c SQL-\u0444\u0430\u0439\u043b\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f SQL-\u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 \u0432 Go-\u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">package main  import (   \"context\"   \"database\/sql\"   \"embed\"    \"github.com\/pressly\/goose\/v3\"   \"github.com\/ydb-platform\/ydb-go-sdk\/v3\" )  \/\/go:embed migrations\/*.sql var embedMigrations embed.FS  func main() {   ctx, cancel := context.WithCancel(context.Background())   defer cancel()   nativeDriver, err := ydb.Open(ctx, \"grpc:\/\/localhost:2136\/local\")   if err != nil {     panic(err)   }   defer nativeDriver.Close(ctx)   connector, err := ydb.Connector(nativeDriver,     ydb.WithDefaultQueryMode(ydb.ScriptingQueryMode),     ydb.WithFakeTx(ydb.ScriptingQueryMode),     ydb.WithAutoDeclare(),     ydb.WithNumericArgs(),   )   if err != nil {     panic(err)   }   db := sql.OpenDB(connector)   defer db.Close()   goose.SetBaseFS(embedMigrations)    if err := goose.SetDialect(\"ydb\"); err != nil {     panic(err)   }    if err := goose.Up(db, \"migrations\"); err != nil {     panic(err)   }    \/\/ \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0436\u0435 goose \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 Go-\u043a\u043e\u0434\u0435. <\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0432\u0438\u0434\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 Go-\u043a\u043e\u0434\u0435.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">package main  import (   \"context\"   \"database\/sql\"      \"github.com\/pressly\/goose\/v3\"   \"github.com\/ydb-platform\/ydb-go-sdk\/v3\" )  func init() {   goose.AddMigrationContext(Up00001, Down00001)   goose.AddMigrationContext(Up00002, Down00002) } func Up00001(ctx context.Context, tx *sql.Tx) error {   _, err := tx.ExecContext(ctx, `     CREATE TABLE users (       id Uint64,       username Text,       created_at Datetime,       PRIMARY KEY (id)   );`)   return err } func Down00001(ctx context.Context, tx *sql.Tx) error {   _, err := tx.ExecContext(ctx, \"DROP TABLE users;\")   return err } func Up00002(ctx context.Context, tx *sql.Tx) error {   _, err := tx.ExecContext(ctx, `     UPSERT INTO users (id, username, created_at) VALUES     (1, 'Bob Smith', CAST('2023-12-01T15:14:13Z' AS Datetime)),     (2, 'Dow Jones', CAST('2023-12-02T12:11:10Z' AS Datetime)),     (3, 'Elon Mask', CAST('2023-12-03T09:08:07Z' AS Datetime)),     (4, 'John Dow', CAST('2023-12-04T06:05:04Z' AS Datetime));    `)   return err } func Down00002(ctx context.Context, tx *sql.Tx) error {   _, err := tx.ExecContext(ctx, \"DELETE FROM users WHERE id in (1, 2, 3, 4);\")   return err } func main() {   ctx, cancel := context.WithCancel(context.Background())   defer cancel()   nativeDriver, err := ydb.Open(ctx, \"grpc:\/\/localhost:2136\/local\")   if err != nil {     panic(err)   }   defer nativeDriver.Close(ctx)   connector, err := ydb.Connector(nativeDriver,     ydb.WithDefaultQueryMode(ydb.ScriptingQueryMode),     ydb.WithFakeTx(ydb.ScriptingQueryMode),     ydb.WithAutoDeclare(),     ydb.WithNumericArgs(),   )   if err != nil {     panic(err)   }   db := sql.OpenDB(connector)   defer db.Close()    if err := goose.SetDialect(\"ydb\"); err != nil {     panic(err)   }    if err := goose.Up(db, \"migrations\"); err != nil {     panic(err)   }    \/\/ \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 goose. Goose \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0445\u0435\u043c\u0443 \u0442\u0430\u0431\u043b\u0438\u0446 SQL \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u0438 \u0441\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0435. \u0423\u0442\u0438\u043b\u0438\u0442\u0430 goose \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u043b\u0438 \u0432\u0441\u0435\u0445 \u0441\u0440\u0430\u0437\u0443, \u043e\u0442\u043a\u0430\u0442\u0430, \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 \u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. Goose \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Go, \u043d\u043e \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c. \u0415\u0441\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u0441\u0430\u043c\u0438\u0445 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0441\u0430\u043c\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0442\u043e \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0441\u0442\u0435\u043a. Goose \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0448\u0430\u0433\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 SQL \u0438\u043b\u0438 \u0432 Go-\u043a\u043e\u0434\u0435.<br \/>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 <a href=\"https:\/\/github.com\/pressly\/goose\/releases\/tag\/v3.16.0\">v3.16.0<\/a> goose \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <a href=\"https:\/\/ydb.tech\/\">YDB<\/a> &#8212; \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e open-source \u0421\u0423\u0411\u0414. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 YDB \u0447\u0435\u0440\u0435\u0437 SQL \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432 Go-\u043a\u043e\u0434\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u043c \u0447\u0435\u0440\u0435\u0437:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/ydb-platform\">GitHub<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/t.me\/ydb_ru\">Telegram<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/783254\/\"> https:\/\/habr.com\/ru\/articles\/783254\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041b\u044e\u0431\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u0435\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 &#8212; \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043e \u0434\u0440\u0443\u0433\u043e\u0439 (\u043e\u0431\u044b\u0447\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u043e\u0439) [<a href=\"https:\/\/habr.com\/ru\/articles\/121265\/\">\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/a>].<\/p>\n<p>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0432 \u0411\u0414 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438). \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e\u0431 \u0443\u0442\u0438\u043b\u0438\u0442\u0435\u00a0<a href=\"https:\/\/github.com\/pressly\/goose\">goose<\/a>. \u042d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0441\u0445\u0435\u043c\u044b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438\u00a0<a href=\"https:\/\/github.com\/pressly\/goose\/releases\/tag\/v3.16.0\">v3.16.0<\/a>\u00a0goose \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u00a0<a href=\"https:\/\/ydb.tech\/\">YDB<\/a>\u00a0&#8212; \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e open-source \u0421\u0423\u0411\u0414. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0435\u0439\u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 YDB.<\/p>\n<figure class=\"full-width\"><\/figure>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 &#171;\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u0445\u0435\u043c\u044b&#187;?<\/h3>\n<p>\u041f\u043e\u0434\u00a0<strong>\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f\u043c\u0438<\/strong>\u00a0\u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u043d\u044f\u0442\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f &#8212; \u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0430\u043c\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 PostgreSQL \u0432 Oracle.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f &#8212; \u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0430\u043c\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f PostgreSQL \u0441 \u043c\u0430\u0441\u0442\u0435\u0440-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0410 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440-\u0444\u043e\u043b\u043b\u043e\u0432\u0435\u0440 \u0411. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0435\u0449\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u00a0<em>\u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439<\/em>.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f &#8212; \u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0439 \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0430\u043c\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 PostgreSQL \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0431\u0435\u0437 \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043a \u0432\u0435\u0440\u0441\u0438\u0438 \u0441 \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u00a0<strong><em>\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/em><\/strong>\u00a0\u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00a0<strong><em>\u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438<\/em><\/strong>\u00a0\u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u043c-\u0442\u043e \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0442\u0435\u0440\u043f\u0435\u0432\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0418 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u0441\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u0433\u0438\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043e\u043d\u043b\u0430\u0439\u043d-\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &#171;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Schema_migration\">\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u0445\u0435\u043c\u044b<\/a>&#171;.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0435\u0449\u0435 \u043d\u0435 \u0432\u044b\u0440\u043e\u0441 \u0438\u0437 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430, \u043c\u043e\u0436\u043d\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u0441\u0445\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0430\u043a\u0430\u0442\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0440\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0432 \u043d\u043e\u0432\u0443\u044e. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u041d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u0442\u0430\u043f\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0411\u0414 \u0438 \u0440\u0435\u043b\u0438\u0437\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0440\u0443\u044e \u0438\u043b\u0438 \u043d\u043e\u0432\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<h3>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430<\/h3>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 &#8212; \u0430\u0434\u043c\u0438\u043d\u043a\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u041e\u0431\u044b\u0447\u043d\u043e\u0435\u00a0<em>CRUD<\/em>-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u043e \u0437\u0430\u0434\u0443\u043c\u043a\u0435 \u044d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>\u041f\u0443\u0441\u0442\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u0440\u043e\u0442\u0435\u043a\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438:\u00a0<code>id<\/code>\u00a0(\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u0438),\u00a0<code>username<\/code>\u00a0(\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f) \u0438\u00a0<code>created_at<\/code>\u00a0(\u0434\u0430\u0442\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438). \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0432\u044f\u0437\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0438\u0445 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (Bob Smith, Dow Jones, John Dow, Elon Mask).<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0441\u043f\u0440\u0438\u043d\u0442\u0435 \u043c\u044b \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u043f\u043e\u043d\u044f\u0442\u0438\u044e \u0440\u043e\u043b\u0435\u0439. \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0440\u043e\u043b\u0435\u0439 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438:\u00a0<code>id<\/code>\u00a0(\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u0438) \u0438\u00a0<code>name<\/code>\u00a0(\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0440\u043e\u043b\u0438). \u0421\u0440\u0430\u0437\u0443 \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0440\u043e\u043b\u0438\u00a0<code>admin<\/code>,\u00a0<code>viewer<\/code>,\u00a0<code>guest<\/code>. \u041d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0440\u043e\u043b\u0438\u00a0<code>role_id<\/code>. \u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0437\u043c\u0435\u0442\u0438\u0442\u044c \u0440\u043e\u043b\u044f\u043c\u0438. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0440\u043e\u043b\u044c\u00a0<code>guest<\/code>\u00a0\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0430\u0434\u043c\u0438\u043d\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u043e\u043b\u044c.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043e\u0441\u043e\u0437\u043d\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0441\u0447\u0435\u0442 &#8212; \u0443\u0447\u0451\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b. \u041c\u044b \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c (\u0445\u044d\u0448), \u0447\u0442\u043e\u0431\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u0441\u00a0<code>password_hash<\/code>\u00a0\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0410 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0435\u0437\u0434\u0435\u00a0<em>middleware<\/em>, \u0447\u0442\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043d\u0430\u0441 \u043d\u0430\u0431\u0440\u0430\u043b\u043e\u0441\u044c \u0443\u0436\u0435 \u043d\u0435\u043c\u0430\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438, \u0447\u0442\u043e \u0432 \u0442\u043e\u043f\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439\u00a0<code>WHERE username=\u2026 AND password_hash=\u2026<\/code>\u00a0\u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043d\u0430 \u043f\u043e\u043b\u044f\u00a0<code>password_hash<\/code>. \u0412 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430 \u044d\u0442\u043e \u043f\u043e\u043b\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435 (\u0432\u0441\u0435 \u043a\u0430\u043a \u0432 \u0436\u0438\u0437\u043d\u0438)<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0440\u0430\u0441\u043d\u043e\u0440\u0435\u0447\u0438\u0432\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u044d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438.<\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 &#171;goose&#187;?<\/h3>\n<p>Goose &#8212; \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u041e\u043d \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Go, \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e &#171;go get&#187; \u0438\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.<\/p>\n<pre><code class=\"bash\">$ go install github.com\/pressly\/goose\/v3\/cmd\/goose@latest<\/code><\/pre>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 goose:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/pressly\/goose\">github.com\/pressly\/goose\u00a0<\/a>(\u0444\u043e\u0440\u043a \u0430\u043f\u0441\u0442\u0440\u0438\u043c\u0430)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/bitbucket.org\/liamstask\/goose\">bitbucket.org\/liamstask\/goose<\/a>\u00a0(\u0430\u043f\u0441\u0442\u0440\u0438\u043c)<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043a\u00a0<a href=\"https:\/\/github.com\/pressly\/goose\">github.com\/pressly\/goose<\/a>, \u0442.\u043a. \u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0448\u0430\u0433\u043d\u0443\u043b\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u0432\u043f\u0435\u0440\u0435\u0434 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0430\u043f\u0441\u0442\u0440\u0438\u043c\u043e\u043c. \u0422\u0430\u043a\u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 YDB \u0432 goose \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u0441\u0442\u0430\u043b\u0430 \u043e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438\u00a0<a href=\"https:\/\/github.com\/pressly\/goose\/releases\/tag\/v3.16.0\">v3.16.0<\/a>.<\/p>\n<h3>\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u043d\u043a\u0438 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439<\/h3>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u043f\u0430\u0441\u0430\u0442\u044c\u0441\u044f \u0433\u043e\u043d\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u043c\u0438 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 (\u043d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0430\u043c\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0438\u043b\u0438 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u044b\u0445). \u041a\u043e\u0433\u0434\u0430 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 &#8212; \u0438\u043c\u0435\u044e\u0442 \u0432 \u0432\u0438\u0434\u0443 \u0442\u043e, \u0447\u0442\u043e \u0441 \u044d\u0442\u043e\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e-\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445). \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442\u0435 \u0441\u0432\u043e\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 500 \u043c\u0430\u0448\u0438\u043d\u0430\u0445. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438. \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 500 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u0445\u043e\u0442\u044f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u00a0<code>CREATE TABLE<\/code>\u00a0\u0438\u043b\u0438\u00a0<code>ALTER TABLE<\/code>? \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e \u0438\u043b\u0438 499 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0432\u0430\u0448\u0435\u0433\u043e \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0442.\u043a. \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u043d\u0438\u0445 \u201c\u0432\u044b\u0438\u0433\u0440\u0430\u0435\u0442\u201d \u0432 \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0439 \u0433\u043e\u043d\u043a\u0435. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0433\u043e\u043d\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u044f\u0432\u043d\u044b\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u0430\u043f\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<code>{Dev,DB}OPS<\/code>\u00a0&#8212; \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435).<\/p>\n<\/li>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432\u00a0<code>leader election<\/code>\u00a0\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u043c\u0430\u0444\u043e\u0440\u0430. \u0412 YDB \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 (<code>coordination service<\/code>), \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0434\u0435\u043b\u0430\u0442\u044c\u00a0<code>leader election<\/code>\u00a0\u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u0435 goose \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 YDB \u044d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0433\u043e\u043d\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c YDB \u0432 \u0434\u043e\u043a\u0435\u0440-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 (\u0441\u043c.\u00a0<a href=\"https:\/\/ydb.tech\/docs\/en\/getting_started\/quickstart\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a>\u00a0YDB):<\/p>\n<pre><code class=\"bash\">$ docker run -d --rm --name ydb-local -h localhost \\ -p 2135:2135 -p 2136:2136 -p 8765:8765 \\ -v $(pwd)\/ydb_certs:\/ydb_certs -v $(pwd)\/ydb_data:\/ydb_data \\   -e GRPC_TLS_PORT=2135 -e GRPC_PORT=2136 -e MON_PORT=8765 \\   ghcr.io\/ydb-platform\/local-ydb:23.3<\/code><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e goose \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 YDB \u043d\u0435 \u043d\u0438\u0436\u0435 23-3.<\/p>\n<h2>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a YDB \u0438\u0437 goose \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0430\u00a0<code>grpc:\/\/localhost:2136\/local?go_query_mode=scripting&amp;go_fake_tx=scripting&amp;go_query_bind=declare,numeric<\/code>.<\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><code>grpc<\/code>\u00a0&#8212; \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e insecure \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e gRPC. \u0414\u043b\u044f \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u0441 TLS) \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u00a0<code>grpcs<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u044f\u0432\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\u00a0<code>$(pwd)\/ydb_certs<\/code>, \u00a0\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:\u00a0<code>export YDB_SSL_ROOT_CERTIFICATES_FILE=$(pwd)\/ydb_certs<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>localhost<\/code>\u00a0&#8212; \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a YDB.<\/p>\n<\/li>\n<li>\n<p><code>2136<\/code>\u00a0&#8212; \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 YDB \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e insecure \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443. \u0414\u043b\u044f \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0438\u043d\u043e\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 YDB) \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u0442\u00a0<code>2135<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u044f\u0432\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438\u0437\u00a0\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\u00a0<code>$(pwd)\/ydb_certs<\/code>, \u00a0\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:\u00a0<code>export YDB_SSL_ROOT_CERTIFICATES_FILE=$(pwd)\/ydb_certs<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>local<\/code>\u00a0&#8212; \u0438\u043c\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 YDB.<\/p>\n<\/li>\n<li>\n<p><code>go_query_mode=scripting<\/code>\u00a0&#8212; \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c\u00a0<code>scripting<\/code>\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 YDB. \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0442 goose \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 YDB \u0441\u0435\u0440\u0432\u0438\u0441\u00a0<code>scripting<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a DDL, \u0442\u0430\u043a \u0438 DML \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 SQL.<\/p>\n<\/li>\n<li>\n<p><code>go_fake_tx=scripting<\/code>\u00a0&#8212; \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0438\u0441 YDB\u00a0<code>scripting<\/code>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 YDB \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 DDL \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 SQL \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e (\u0438\u043b\u0438 \u043d\u0435\u0441\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b). \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u00a0<code>scripting<\/code>\u00a0\u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 (\u0441 \u044f\u0432\u043d\u044b\u043c\u0438 <code>Begin<\/code>+<code>Commit<\/code>\/<code>Rollback<\/code>). \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0440\u0435\u0436\u0438\u043c \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u043d\u0430 \u0434\u0435\u043b\u0435 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e (nop) \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u0430\u0445 <code>Begin<\/code>+<code>Commit<\/code>\/<code>Rollback<\/code> \u0438\u0437 goose. \u042d\u0442\u043e\u0442 \u0442\u0440\u044e\u043a \u0432 \u0440\u0435\u0434\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 YDB \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043d\u043e\u0432\u044b\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c\u00a0<code>query<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043c\u043e\u0447\u044c \u0443\u0431\u0440\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0438\u0441\u043a.<\/p>\n<\/li>\n<li>\n<p><code>go_query_bind=declare,numeric<\/code>\u00a0&#8212; \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u043e\u0432 \u0430\u0432\u0442\u043e-\u0432\u044b\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 YQL \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (<code>declare<\/code>) \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u043e\u0432 \u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 (<code>numeric<\/code>). \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e YQL &#8212; \u044f\u0437\u044b\u043a \u0441\u043e \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0439 \u044f\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0442\u0435\u043b\u0435 \u0441\u0430\u043c\u043e\u0433\u043e SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438\u00a0<code>DECLARE<\/code>. \u0422\u0430\u043a\u0436\u0435 YQL \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0<code>$my_arg<\/code>), \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u044f\u0434\u0440\u043e goose \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 (<code>$1<\/code>, <code>$2<\/code> \u0438 \u0442.\u0434.). \u0411\u0438\u043d\u0434\u0438\u043d\u0433\u0438\u00a0<code>declare<\/code>\u00a0\u0438\u00a0<code>numeric<\/code>\u00a0\u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437 goose \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 YDB, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u0432 goose. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0430\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/companies\/ydb\/articles\/747490\/\">database\/sql \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u0434\u043b\u044f YDB \u0432 Go<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00a0<em>goose<\/em>\u00a0\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a YDB, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f\u00a0<a href=\"https:\/\/ydb.tech\/docs\/en\/reference\/ydb-sdk\/recipes\/auth-anonymous\">anonymous credentials<\/a>. \u0427\u0435\u0440\u0435\u0437 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:<\/p>\n<ul>\n<li>\n<p>\u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a YDB \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<a href=\"https:\/\/ydb.tech\/docs\/en\/reference\/ydb-sdk\/recipes\/auth-static\">static credentials<\/a>\u00a0\u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (<code>login<\/code>\u00a0\u0438\u00a0<code>password<\/code>):\u00a0<code>grpc:\/\/login:password@localhost:2136\/local?...<\/code>\u00a0.<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a YDB \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<a href=\"https:\/\/ydb.tech\/docs\/en\/reference\/ydb-sdk\/recipes\/auth-access-token\">\u0442\u043e\u043a\u0435\u043d\u0430<\/a>\u00a0\u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440:\u00a0<code>grpc:\/\/localhost:2136\/local?token=&lt;ACCESS_TOKEN>&amp;...<\/code>\u00a0.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 YDB \u0438\u0437 <em>goose<\/em> \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f.<\/p>\n<h4>\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439<\/h4>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e\u00a0<code>migrations<\/code>\u00a0\u0438 \u0434\u0430\u043b\u0435\u0435 \u0432\u0441\u0435 <\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-364035","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/364035","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=364035"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/364035\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=364035"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=364035"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=364035"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}