{"id":350,"date":"2026-02-06T18:01:17","date_gmt":"2026-02-06T17:01:17","guid":{"rendered":"https:\/\/blog.ctr24.co.pl\/?p=350"},"modified":"2026-02-06T18:01:17","modified_gmt":"2026-02-06T17:01:17","slug":"migracja-modeli-flask-do-bazy","status":"publish","type":"post","link":"https:\/\/blog.ctr24.co.pl\/?p=350","title":{"rendered":"Migracja modeli FLASK do bazy"},"content":{"rendered":"\n<p>To jest <strong>z\u0142oty, atomowy, bezpieczny workflow<\/strong>, kiedy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>modele si\u0119 zmieni\u0142y,<\/li>\n\n\n\n<li>baza by\u0142a modyfikowana r\u0119cznie,<\/li>\n\n\n\n<li>migracje s\u0105 niesp\u00f3jne,<\/li>\n\n\n\n<li>chcesz wr\u00f3ci\u0107 do pe\u0142nej synchronizacji bez walki z b\u0142\u0119dami.<\/li>\n<\/ul>\n\n\n\n<p>Schemat:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>flask db stamp head\nflask db migrate -m \"aktualizacja modeli i zmian\"\nflask db upgrade\n<\/code><\/pre>\n\n\n\n<p>jest <strong>idealny<\/strong> w takich sytuacjach.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udd0d Dlaczego to dzia\u0142a tak dobrze?<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. <\/strong><code>flask db stamp head<\/code><\/h3>\n\n\n\n<p>M\u00f3wisz Alembicowi:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eUznaj, \u017ce baza jest ju\u017c na najnowszej wersji migracji \u2014 niczego nie wykonuj.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p>To resetuje stan migracji <strong>bez dotykania struktury bazy<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. <\/strong><code>flask db migrate<\/code><\/h3>\n\n\n\n<p>Alembic patrzy na:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>aktualn\u0105 baz\u0119,<\/li>\n\n\n\n<li>aktualne modele SQLAlchemy,<\/li>\n<\/ul>\n\n\n\n<p>i generuje migracj\u0119, kt\u00f3ra <strong>wyr\u00f3wnuje r\u00f3\u017cnice<\/strong>.<\/p>\n\n\n\n<p>To jest moment, w kt\u00f3rym:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>usuwa zb\u0119dne kolumny,<\/li>\n\n\n\n<li>dodaje brakuj\u0105ce,<\/li>\n\n\n\n<li>poprawia typy,<\/li>\n\n\n\n<li>usuwa\/odtwarza FK,<\/li>\n\n\n\n<li>synchronizuje indeksy.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. <\/strong><code>flask db upgrade<\/code><\/h3>\n\n\n\n<p>Wykonuje now\u0105 migracj\u0119 i od tego momentu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>baza = modele,<\/li>\n\n\n\n<li>migracje = aktualny stan,<\/li>\n\n\n\n<li>wszystko jest sp\u00f3jne.<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83e\udde0 Kiedy ten workflow jest najlepszy?<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>po r\u0119cznym grzebaniu w SQL,<\/li>\n\n\n\n<li>po usuni\u0119ciu relacji z modeli,<\/li>\n\n\n\n<li>po dodaniu kolumn r\u0119cznie,<\/li>\n\n\n\n<li>gdy migracje s\u0105 popsute lub niesp\u00f3jne,<\/li>\n\n\n\n<li>gdy masz b\u0142\u0119dy typu:\n<ul class=\"wp-block-list\">\n<li>\u201eduplicate column\u201d<\/li>\n\n\n\n<li>\u201ecannot drop index\u201d<\/li>\n\n\n\n<li>\u201eforeign key constraint fails\u201d<\/li>\n\n\n\n<li>\u201etable already exists\u201d<\/li>\n\n\n\n<li>\u201ecolumn already exists\u201d<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>To jest <strong>najczystszy spos\u00f3b<\/strong> na przywr\u00f3cenie porz\u0105dku.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udd25 Pro tip <\/h1>\n\n\n\n<p>Je\u015bli pracujesz du\u017co z modelami i migracjami, to workflow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>flask db stamp head\nflask db migrate\nflask db upgrade\n<\/code><\/pre>\n\n\n\n<p>jest \u015bwietny <strong>po ka\u017cdej wi\u0119kszej refaktoryzacji modeli<\/strong>, bo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>nie musisz r\u0119cznie naprawia\u0107 migracji,<\/li>\n\n\n\n<li>nie musisz walczy\u0107 z FK,<\/li>\n\n\n\n<li>nie musisz usuwa\u0107 tabel,<\/li>\n\n\n\n<li>nie musisz r\u0119cznie edytowa\u0107 SQL.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>To jest z\u0142oty, atomowy, bezpieczny workflow, kiedy: Schemat: jest idealny w takich sytuacjach. \ud83d\udd0d Dlaczego to dzia\u0142a tak dobrze? 1.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-350","post","type-post","status-publish","format-standard","hentry","category-python"],"_links":{"self":[{"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/posts\/350","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=350"}],"version-history":[{"count":1,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/posts\/350\/revisions"}],"predecessor-version":[{"id":351,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/posts\/350\/revisions\/351"}],"wp:attachment":[{"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=350"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=350"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=350"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}