Skip to content

Upgrade instructions

Adam Plaice edited this page Aug 29, 2021 · 34 revisions

This page includes instructions on how to upgrade from specific versions of the deck. If your upgrade scenario is not listed below, please refer to the instructions in the README.

Unless otherwise mentioned, the version of the deck is given on the deck description page.

From v4.1 to v5.0

English versions

If you have the English versions of the deck (standard or extended), you can follow the normal installation/upgrade procedures.

All other language versions

Due to a mishap with GUIDs (which are about as annoying as they sound :)), the original v4.1 release was buggy. QUESTION: Is this too casual? (My point was to emphasise that the problem wasn't on the side of the contents, but of the "plumbing", without digging into the details.) The v4.1 release was quickly taken down and the issue fixed in the v4.1.1 release, but you might have installed the buggy version in the meantime.

You'll have the buggy version if you installed between 1 February and 6 February 2021. If you don't remember when you installed the deck (I wouldn't, after several months!), you can check whether you have the buggy version of v4.1 ("v4.1.0") with this debug console snippet:

Debug console snippet to determine if you have the buggy v4.1
# Scotland chosen because its name is different in all our languages.
guid_scotland = "h~5xz+=ke~"
en_scotland = "Scotland"
scotland_fields_arr = mw.col.db.execute("SELECT flds FROM notes WHERE GUID = ?", guid_scotland)
if len(scotland_fields_arr) == 1:
    scotland_country_name = scotland_fields_arr[0][0].split('\x1f')[0]
    if scotland_country_name == en_scotland:
        print("You have the English version of the deck.")
        print("v4.1.1 and v4.1 are identical for you, so you don't have to worry!")
    else:
        # In principle, it's also possible you have the English version,
        # but changed the name of Scotland.  However, it's unlikely.
        print("You have the buggy version of v4.1 (v4.1.0)!")
else:
    print("You DO NOT have the buggy version of v4.1!")

If you're not familiar with the debug console, you can access it with Ctrl+Shift+;. After pasting the snippet into the top box, you can execute it with Ctrl+Enter.

From v4.1.1

Not English, French or Norwegian

If you have the Czech, German, Spanish, Dutch, Russian or Swedish version of the deck (standard or extended), you can upgrade using the normal installation/upgrade procedures.

French or Norwegian (Bokmål)

If you have the French or Norwegian (Bokmål) versions of the deck, you need to first run a debug console script.

Rationale if you're interested in why this is necessary

Every note in Anki has a GUID (globally unique id). This allows two notes to be recognised as the same, irrespective of what deck, whose collection or what device they're in.

Due to design choices in the previous Deck Manager we used (anki-dm), the GUIDs in the English and Norwegian versions of the deck were the same, and so were the GUIDs in the French and Spanish versions of the deck.

This meant that while it was possible for somebody to have, say, the English, German and Spanish decks, in parallel, in the same Anki collection, they could not have both the English and Norwegian decks or both the French and Spanish decks, together. For instance, if you had the French version of the deck and tried to install the Spanish version, then due to the clashing GUIDs, Anki would think that the notes in the Spanish deck were updates to the notes in the French deck, and would overwrite your French deck, instead of adding the Spanish deck in parallel.

This limitation wasn't catastrophic, but it was annoying and confusing to explain, so we decided to migrate the French and Norwegian GUIDs, in order to remove it.

French

You need to run the following debug console script. Note that if you use AnkiWeb, a full upload will be necessary the next time you sync.

Debug console snippet to migrate the French GUIDs
guid_mapping = \
[('6=u<D5pin$', 'p);vRzMs+W'),
 ('9hd8!!ycm1', 'Ive-9<)?/'),
 ('-*s*/9Bs5]', 'o6puwHE{j4'),
 ('4X<I%j50vO', 'ua?z9KS@^h'),
 ('&<jl3wt=@N', 'o.l+o.aIv#'),
 ('9V(hJ,wI/J', 'i+%_VY]7bt'),
 ('#VI;#M=9p0', 'vwLrgavleL'),
 ('#f!B=ER`FI', 'umk_Ql/M`8'),
 ('(=4za=v)XL', 'F*@Hxe1UYX'),
 ('!t*473y]Ab', 'oTmq$Cq1H`'),
 ('&kNm}C1;F^', 'fe<{h`wWIF'),
 ('8HhkHhJ{zG', 'dTNjd[5|Ge'),
 ('56heGus|:W', 'e?6[KX^Js+'),
 (',{L,s4k?Ei', 'CJb&~c&tZv'),
 ('$*(t0;xm-I', '0/,+rSKt6'),
 ('%-!:KaSHN^', 'qTFGENa@Y3'),
 ('#1;Z.gJtCH', 'AtMq%)YA4~'),
 ('&HCzzs8Azt', 'O0NI(S,j2o'),
 ('/$EW+%8{uu', 'm]_=p1zwik'),
 ('3sa$9R,{2H', 'uuu#3&G{(R'),
 ('.E2S!BCc]o', 'qMOzrk<+(:'),
 ('$0oS&elogg', 'zXq}ul(8_E'),
 ('sMhU>3vg+', 'i_0H+>}|<.'),
 ('$~oj/Wt/Ds', 'G6=c,ll^]`'),
 ('$g#hDGvSF;', 'jk_(_rr<<!'),
 ('#(P(|c!kKo', 'IJG[L,X;A3'),
 ('-_F_/K$VQL', 'vaSXyU,d,a'),
 ('46.6)30lNw', 'L[=I7EcROn'),
 ('&;_]4B@=PD', 'L&#(>5c7a*'),
 ('%-a<I17=N1', 'Q}6:Ng``xM'),
 ('$7da!Nj/Q:', 'upq|kJ[Qi$'),
 ('!!D6Ivb.]#', 'w1FM?@j-tk'),
 (',%%ecY+9=G', 'gPWIY|dqgC'),
 ('(QQ?Y*LQ]c', 'hBl;b1akKo'),
 ('X0E7(l<s4', 'kbJZsU]Tm~'),
 ('&|Jl^Y30aG', 'x)ZvHsvNcz'),
 ('/ZZE730XJ6', 'nlky<K>nXE'),
 (')`rlSMmq5C', 'B)M|?v5vl3'),
 ('%yG[ER$x!n', 'DUa%sQ;0;@'),
 ('7{Nf8U(:Yv', 'IkP885[1L6'),
 ('+~@cG#)SLP', 'h0~.:5}&Q8'),
 ('#KODG$yc>M', 'INr2(vFB[p'),
 (':no*A/F-X7', 'Q=UkoGw%47'),
 ('#*v.r[&I!:', 'HsOJP(RQoY'),
 ('/qbzM$A]}&', 'J#u?@$XnR$'),
 ('+3Tw45u=NZ', 'iB7LW}8*Ii'),
 ('8?DMM6C%Mz', 'vbEn[U)2cf'),
 ('7!~yssKO^1', 'n65[nUZiZc'),
 ('-1dy+?BC2Z', 'K6g6$oK|jN'),
 ('%2B%b*%04$', 'O}c<W!@%aZ'),
 ('#L#s^-u~3#', 'g[tAvcrR3^'),
 ('9chyXc|PI{', 'Ft$h3i.|l.'),
 ('&s~^Wl-d_U', 'y8u|!Om27i'),
 ('4:raHq`A,^', 'lo1wB^!`h,'),
 ('$sM{>P7XjN', 'y`v(^%tvG3'),
 ('!igL313u6Z', 'uO%6i;{0PZ'),
 ('#.pgRFoi{5', 'Ddu%%IIGo*'),
 ('3lK*SldlTg', 'rl:ZBh8sp^'),
 (')v:.,va`^]', 'cHz7UCnS&i'),
 ('+)Q)kWr_&W', 'wAQL>iJ/-]'),
 ('/xT`}}~iCg', 'cM;m6U=Dg5'),
 ('(]fmzQ[XIP', 'FFMu>hPw;u'),
 ('#!,>y|yo#S', 'I_Q-5hX|5;'),
 ('w4mckxRd8', '[#-i4q4Hz'),
 ('8N<ZUI<7U{', 'z7[5xEgcrA'),
 ('8m=%vP4<vl', 'Ay%EM@L0b~'),
 (':VT&estn,-', 'bsVR4>6gl0'),
 ('-vzFkuSyI', 'QykP%i/vKj'),
 ('86,Z?=IsFl', 'bP:bhgKryC'),
 ('#_PR1yB8Ma', 'G@(d+tSaA^'),
 ('.dNLR]_sx)', 'm$gS*RQqQ1'),
 ('#VE^N5hGYu', 'O#$FD?t_j)'),
 (')#^@iC_^[S', 'o#s^(c`}.G'),
 ('!Zw]xBvuR}', 'w[%X~D#R,7'),
 ('!b-gm4nTaZ', 'CY~?X/vp+j'),
 ('*0z&2xS`./', 'Cu].QU#a&l'),
 ('.fSbI)(WoY', 'hX`.aRn$&{'),
 ('*@96zt>W(p', 'IThTxqnu;|'),
 ('7,cs//Xh%G', 'lW;xJ;HJv/'),
 (')V0#0Kxsw}', 'c(A-(Xa1)x'),
 ('(A@dh_GNTI', 'hv3J+WS`/,'),
 ('&eYZ1wa1.|', 'y;mRF(PX>0'),
 ('-0_uAO:q9w', 'q1DvZ4Qkh,'),
 ('5?1c-[%F4W', 'k{y?<`|#63'),
 ('#S<rhq}E^A', 'ny_8#ZQA/?'),
 ('-s<:n-Y4O`', 'svVKQZTWFU'),
 ('&qqVQS/L4K', 't,2AZ>_CA/'),
 (':oOUjPA0l@', 'n,~jhT?[]W'),
 ('&sRN]ZC^IC', ']#3u-c%5X'),
 ('#k5iRD7&/,', 'Qw(O&Fnkul'),
 ('-Jf2|I3J_%', 'Hk9k3U@-DA'),
 ('/f,JZwW]PF', 'LG(/,IHQi@'),
 ('#;To0tpzRI', 'xwNS`|r~1x'),
 ('.?}z):Mm{e', 'qJP9,I/X;?'),
 ('9z,F5a_,MU', 'H38F4o,>An'),
 ('/ke~[g[5o.', 'xc)G{&Ta22'),
 ('6@4k^ad#{7', 'DS~l]pq.y<'),
 ('$[5~vtlvR{', 'uNyx=*R.$~'),
 ('6%=p&3,>uY', 'E2g&j~V_+i'),
 ('*]@=|(P&<T', 'umTKoLZSfc'),
 ('.=6hM$s#y-', 'hZ-27c=iA5'),
 ('73Gm00~5lE', 'H(5ar5kY/Y'),
 ('8A@HUJr:ff', 'oi2j6zc,T]'),
 ('4IW9N[*%GC', 'bDx}p^DSVL'),
 ('7F#;o#)skB', 'hN=Lly0+D{'),
 (',_;c/s#fv@', 'w#;7*w+/l+'),
 ('6|`1h}9+}T', 'wt?Q|)Y7F1'),
 ('&%UrM&9*M^', 'i_cTqW/(1E'),
 ('-B?LuKnS-_', 'q@wPIm/;#)'),
 ('%=z.T2U3DH', 'DN*^.Q~HcI'),
 ('$Yv;,~-qh^', 'x2E6#%E!/p'),
 ('-6zBhoKab*', 'r{g3sXk]Cm'),
 ('&R+cVo=x@J', 'Jcx)35]`H]'),
 ('34oNS(6k9e', 'bp+p&^O&Nz'),
 ('-FIWqaZ=JS', 'HPt<x)x%Jh'),
 ('+!j{6/<S]Z', 'p`7>hfkNfW'),
 ('%xM&}K46Wj', 'C^p96b?pgu'),
 ('&j!yffCSDy', 'g^hxtS_)Ja'),
 ('!r=zLB$L+y', 'N@X:<s:Osr'),
 ('#Qh=s|ej#b', 'Kc0|/i[KY@'),
 ('9|Lp]CQLcb', 'm`:zwx?UCO'),
 (',&$^l?t%<u', 'kfOOt3pPdZ'),
 ('!;Dq}1-MZD', 'G]3ZD2G$ww'),
 ('%gC$*1tfYh', 'rHNPZJUEFp'),
 ('&BOwzZ[?oQ', 'f;],oZor+L'),
 ('!4zXnDu[kP', 'CW+/?p:?BO'),
 ('*sUb?H$Mz_', 'FHqW?gqMKx'),
 ('6C_}Ueyong', 'HQ$_4*oGf3'),
 ('%<Up(wv26R', 'pcYb[d%n,O'),
 ('5#NGm&~Qb]', 'g8.ti_%`5'),
 ('95;[^xx(0{', 'hE&?:>xB0v'),
 ('&sa}G#;+dP', 'MV[vr/8+{>'),
 ('6I/|P;+uP+', 'HrZ~>9NjBH'),
 ('%#/9gH$pBE', 'A_Vjy~^@?}'),
 ('8_CQg1KM;?', 'DDzO/+_}ww'),
 ('!Q@j;oDlzU', 'x7GO_2-WY$'),
 ('&eZ:rb2,KA', 'i3#3D+l`w$'),
 ('%vEb08UVjK', 'f0b;Rq1k!_'),
 ('4TAgip=34#', 'twkWz3eS+-'),
 ('6`t^+Ihw=b', 'j8XG#DTPjL'),
 ('&~heQ]qzLh', 'AmEQ/?7Q#x'),
 ('8*6K9&w+HE', 'Iq@M;2CIzf'),
 ('8hl0)=npe/', 'uhYJm4N/!$'),
 ('9MdUp{rI|T', 'oCa[}6b]{J'),
 ('7Z@:HCq)~;', 'ymuYBM5)ux'),
 (')hJ.^svNj|', 'u9/j`LQwrv'),
 ('/?GN3hOh;]', 'B|v&Z,u=T'),
 ('6$a$0NrHg[', 'bTrCSD^W4m'),
 ('*Lx=O4#}}}', 'xQK`2V6wDX'),
 ('&j*`NS9VX6', 'r7L@;3f5Y^'),
 ('8JI.v!2-9k', 'vy}j#{dVU,'),
 ('%p_,w4-u*E', 'M4#3n[]D/T'),
 ('$8H<CYW:j{', 'p(t;=_z4`='),
 (',{RxI#)OqC', 'Gh36nI3h)B'),
 ('(/zPGU)G[h', 'A%emXRt~a]'),
 ('$p$KneE.7u', 's9?zpnq?/g'),
 ('-x.Z)J:Wq7', 'Osy[q7a%UV'),
 ('+)DCoJT@`+', 'iyxxWaZ8Wb'),
 ('9w+LY`MQI=', 'fRSFWQK>W('),
 ('%u?5Uvi7Iw', 'lcC48!,,{,'),
 ('+]`9*|j,48', 'ja9thWdG~?'),
 ('-,vL,Ck1b<', 'Cdm[YJ2i`t'),
 ('#JOB#-z}f0', 'BxD0*Nx8HN'),
 ('$w,nJG9B]S', 'mK?UY]$UVp'),
 ('6|R,LHN4W<', 'e-#MW&-!m7'),
 ('),m?:sFJM)', 'O_HGdfn7R7'),
 ('-$(A|xCw_Q', 'rnHajUXn]|'),
 ('$9D)+!30rS', 'ns:xfr`B.`'),
 ('54#chhJxe$', 'JXC>bWd>&Z'),
 ('C<30_,bn[', 'BNN4wvUA&P'),
 ('6|Sy`~3!SD', 'sOd2&00m?K'),
 ('3}:C`LN-gu', 'q382+6kQ}}'),
 ('-F<:3!Mw)S', 'sgq|,rEUT>'),
 ('.#L|`l0FG!', 'Mmy:MH3p-5'),
 (',XPV8.Y1]a', 'bb1Lx^zyVu'),
 ('%I8+tuQBJS', 'mSo]}$<EpU'),
 ('97u^uvmjWX', 'OXH#q-u9XF'),
 ('9/GzY1g[3q', 'P[t`X50n$K'),
 ('.%}9u/#wp_', 'CaSU3w{HJO'),
 ('8J%?A2<9^^', 'b(JUWzefV^'),
 ('.1Y%ZGu9B$', ':?*,_d`iM'),
 ('O%RvG>|&U', 'N$AR]vQR?L'),
 ('6ePg6aB;Xn', 'jFv`AX2j9Z'),
 ('.kYP5Cfn.X', 'w{[+/hi?P7'),
 ('/Pp>neNJBu', 'C}D/)CbE1E'),
 ('$-~F9])-*A', 'r]by!Z{bH3'),
 ('52|EyK(XJ`', '5H}uoT?x9'),
 ('.cSpQ^;3]E', 'd_{5}`KOeV'),
 ('+`7CxeatsD', 'b=!Fr*y_C!'),
 (':x<[.Y4EzS', 'P[nc3.TLD`'),
 ('&!)INMVCp:', 'G~@ufSz/a;'),
 ('$gcuZbj4h-', 'J32gf}o<MD'),
 (':iuV9+QXx~', 'dnCkHdCc(#'),
 ('4>dnXM*r6i', 'M$iq^Ddz$z'),
 ('8xCSB:9T#%', 'cH+7jy4I,m'),
 ('8Fvw!]i-Ky', 'uQ-6g&t&/t'),
 (',ap,Z]l4j~', 'ltf#^eLgH='),
 ('860fGtb*C', 'cYWtxb5I.n'),
 ('%PEa&:7)~{', 's&%k)X]^%+'),
 ('+FlzQtk`=B', 'b-3J|=Nm69'),
 ('%qMWTh4cJt', 'G;f97RI^i|'),
 ('#z:ag9+^G`', 'Lng7&qhm~G'),
 (',|(kc|s`8L', 'L~g[-Y5a.V'),
 ('%mSEQe2l<A', 'uEmYu^%Cdm'),
 ('Gh*ms#MOV', 'dW]ePHn0<E'),
 ('7</<K,iSXc', 'xj/*Nw.FyN'),
 ('+~JfScn!`6', 'I5l?zw=g2W'),
 ('+(OZso/p.^', 'HF8bKY!Wia'),
 (':ENbJ%yR,D', 'PcUr6zy#ql'),
 ('6_`wCn#u5[', 'uTx.c_gB-g'),
 ('#`/r{t6kJ$', 'M=(.zK+i8]'),
 (')igfmH$6J&', 'w?},I|jwcN'),
 ('3b[296X{9?', 'wU6oi[(~g5'),
 (')dGvASz&G>', 'rJf@3vMORX'),
 ('*Hn*p*)1#L', 't)7YT?VSxY'),
 ('43cTOGEj)l', 'm*zfj4hJj+'),
 ('&<={(+jozV', 'z#:5{OdBN]'),
 ('-5!6[%RV9*', '`ePFuGBDX'),
 ('&yogG~T>p3', 'co2;shq(5S'),
 ('9gWY@FF|-W', 'z>%tQDyw7D'),
 ('61xR!}Ai>,', 'yc9tc)O|D)'),
 (':MC[k=Y11F', 'CmEf8|#B?{'),
 ('.rmM.@lH+_', 'QG_m`Y6OnU'),
 ('$5DS;+F%kJ', 'H~PFXc^2.|'),
 (',[$I2]lD>K', 'CuDj}XI),:'),
 ('3~naGW46|}', 'j]:U,18j(c'),
 ('+D,[UF8cTc', 'c+Zk;oa>e/'),
 ('#5yj*07m,E', 'dy>%OTh=dS'),
 ('%/jf,8#~[^', 'j_Sf!`8fUy'),
 ('5myhN(r.ry', 'ET[Oa;OLaK'),
 ('$MiT.z/Fc8', 'wt]m$(ynIk'),
 ('5dG$pYv{K<', 'dC[x.]4VGu'),
 ('*a4gvLV](+', 'w?1B]|VvAn'),
 ('(q-])R)46M', 'N?ze.ZE4@K'),
 ('*g>LI2fHxg', 'DRS!iJyvJG'),
 ('/D~Q*P+F}F', 'L5qdsn2.Vt'),
 ('-Z7sTcvA-:', 'u:[~?k7{9`'),
 ('3v(.j8C)yi', 'ct@4i2c5]R'),
 ('6Gv>I942T8', 'Pki<F_#mJ$'),
 ('4brK(ueHjr', 'v&W7WvlFQH'),
 ('.U:4$M0^-D', 'JS/Mu$zWXF'),
 ('#S,&1?JB/4', 'd*RV!D6_/z'),
 ('5KvPdycB[*', 'r6u%*kzI$i'),
 ('/^I6?3XNUl', 'L{DDezoz^'),
 ('8L3/=bn10A', 'wao7Vn!%<:'),
 ('pjDe<0+nI', 'B,.i%oyEc%'),
 ('@A!3Lr}AC)', 'k9gbGeqVQp'),
 ('}W[v]WLqpS', 'N;|zJ3r1U0'),
 ('`[EFj3Q_Xc', 'x!47n<n_@M'),
 ('aX)c#|LzSg', 'ilFuAD^xhq'),
 (',0YP]2b@j(', 'KfB$YBpp#='),
 ('4Dq;11v]_e', 'oPx5Bq1z_~'),
 ('7<aB1a+~cq', 'xs+r,A:Ybh'),
 ('(C]g#<ka!b', 'l:S1L#&(=-'),
 ('71i7gJj,l8', 'vV<w5Z&41M'),
 ('8Oe@_|:,Pp', 'l?;mPU|Vu$'),
 ('-U}*=l~z0q', 'g&y>f[SfCo'),
 ('5t]f^yIVO5', 'mC$X9cRfF4'),
 ('4M<E98:`~`', 'CJHNGvTT1-'),
 ('6VjEVH*n<a', 'c.@-5vbYSr'),
 ('%xBPj3X%+H', 'Bvr#2W*V4O'),
 ('6x64b,+z|j', 'HY(==0nL/5'),
 ('^#5pa%x1,X', 'x9m098F78O'),
 ('+9>b&ggK{8', 'QGDo{u)NuE'),
 ('=5v4XjOX^U', 'j7FyQaW,n{'),
 ('{<NC:Dq=AP', 'QwwgN[<duR'),
 ('6cwO!PU0l6', 'gb>Q&:;ekF'),
 ('!Jsg$jKgv+', 'dNo9L*#}F?'),
 ('>0NDs;]+8P', 'f^0aH]F%!V'),
 ('<!OcYW#vke', 'kfniDM68Fr'),
 ('`vw1aQoPmt', 'HG:Vbwri`^'),
 ('8Z^|Di-3{d', 'QplodT,RlZ'),
 ('}.rQ5q3d<D', 'b<9P_L#s6?'),
 (',:Shm37_h@', 'L}~TYYHI[l'),
 ('<a]{=Rhi4', 'Jt*Ggc<HyU'),
 ('@]8x06>+BF', 'vhs6OnHZaA'),
 ('>]pOHrn[3r', 'H1L?;^]mY]'),
 ('5g?v1zUT>w', 'IG)L^LIKi]'),
 ('a%:~pq*Zm{', 'jcw8^HL&m5'),
 ('-f.maKrMXZ', 'P}xBc:eoH6'),
 ('.-9~%U?$I:', 'yu2IoRS.M)'),
 ('6P-AoL#`1)', 'k]|`O*|sYC'),
 ('*Y0`l7(NW{', 'HnPq%JW}F9'),
 ('+q6ucl<dnP', 'BZ#71-])!<'),
 ('b-MN}/UQnp', 'hzN$`?YJ.^'),
 ('#6!CT^2j*&', 'H5FPagvP>_'),
 ('Ktd^5Q1j?', 'FIQ,YV4(u'),
 ('5%Xglve#^/', 'FE||8n;*pO'),
 (')*H8xs9sa@', 's~{9dxCHY+'),
 ('{miPy~A<!k', 'BLz2@~|QXB'),
 ('f01lKj)]XJ', 'Q&)&?}53&@'),
 ('4siewp.4[V', 'bP[|CaNP86'),
 ('(eHZaC~(l;', 'Ba#m$J?4gW'),
 ('<y2-E`C%:d', 'Mie3UMRyst'),
 (':zYlU5e>v/', 'n^,sUM_!k_'),
 ('h,gB?X*uD', 'xAxtN`17x^'),
 (')3u-*ZQo7+', 'B35In/Q=Tg'),
 ('3LA?Jag<~4', 'GRj)gtiMbo'),
 ('awWq`A6Q!q', 'l&Uv?yLL12'),
 ('ftTMc81UP$', 'bMX+]D]Ya>'),
 ('*E7|5>f|hE', 'E9Y{~}fJ|q'),
 ('+N5*Ov8;6:', 'wx)T{wK99M'),
 ('unrS^0xLD', 'vk=UoW^`zU'),
 ('.!m2T?CMvM', 'Ek~&z$tb-I')]

def replace_guids(mw, mapping):
    for guid_i, guid_f in mapping:
        # These should NOT be present.
        ids = mw.col.db.execute("SELECT id FROM notes WHERE guid = ?", guid_f)
        if not len(ids) == 0:
            print(f"GUID {guid_f} already exists as note id(s) {ids}!")
            print("You either already have the deck with the correct GUIDs or something's gone wrong.")
            print("Aborting GUID-replacement operation!")
            return 1
        # These should be present.
        ids = mw.col.db.execute("SELECT id FROM notes WHERE guid = ?", guid_i)
        if not len(ids) == 1:
            print(f"Warning: note with GUID {guid_i} does not exist!")
            # not aborting — the user might have simply deleted some notes
    for guid_i, guid_f in mapping:
        # Not doing everything in one go with `executemany` for readability.
        mw.col.db.executemany("UPDATE notes SET guid = ? WHERE guid = ?", [(guid_f, guid_i)])
    # We need to force a full sync!
    mw.col.db.execute("update col set scm=?", int(time.time() * 1000))
    print("GUID replacement was successful! "
          "If you use AnkiWeb, a full upload will be needed next time you sync!")
    
replace_guids(mw, guid_mapping)

If you're not familiar with the debug console, you can access it with Ctrl+Shift+;. After pasting the snippet into the top box, you can execute it with Ctrl+Enter.

After running the debug console script (and after or before the full sync — it doesn't matter), you can upgrade to v5.0 by following the normal installation/upgrade procedures.

Norwegian (Bokmål)

You need to run the following debug console script. Note that if you use AnkiWeb, a full upload will be necessary the next time you sync.

Debug console snippet to migrate the Norwegian GUIDs
guid_mapping = \
[('e+/O]%*qfk', 'iR~,tG{Val'),
 ('h~5xz+=ke~', 'dYU=!{y0JI'),
 ('s9-GL*@AXD', 'o+)poCG*[u'),
 ('cPO|Cru8n<', 'rymWNfd[Q['),
 ('m*#%sE.`.;', 'PgW-Gd/F7?'),
 ('hNE9}>;Q&-', 'D_u6CIg+wo'),
 ('jN|NAUP*h}', 'emhqi6m<;X'),
 ('j|z@PMgdx,', 'K-DUUlt#`y'),
 ('n+t>2`:;P/', 'dSwjDNnc7['),
 ('ilGtw#=asM', 'fWbYL=>/W&'),
 ('mcc&0Kq^xE', 'L5j),}Ge5('),
 ('gz9${p}er*', 'l$1j[S4Z_w'),
 ('dY96`C-f(_', 'AY#z1NqLE<'),
 ('r>aI-$$|wT', 'po@@>#g44W'),
 ('k9E.p^<u$,', 'ru^aT_ML-F'),
 ('l$zM~ihPFE', 'eX=4L.MZ/)'),
 ('jTNoKo}Bu+', 'j4W[{Wd$i.'),
 ('mz[>>AxIr4', 'g3SU#SH>>e'),
 ('u4^lH.xem5', 'yLv#s7(0/U'),
 ('bk2ByZIeU+', 'n`P0w@?q1u'),
 ('twrhzJ[k:Z', 'fy^;okm_1k'),
 ('kS)hDm%w}R', 'EHD^CXLh4!'),
 ('AES],s:8=', 'd55<bwWcif'),
 ('k[)#L4.[v3', 'Fwsjx3/<>H'),
 ('k}A9]O:0xw', 'n{xEq+_:c{'),
 ('j7eEZkzsCZ', 'rQ)Q-EabYy'),
 ('s<_WLSB3I/', 'oLdeL6a~[X'),
 ('cYKvF#ptF7', 'b<&&OM3fYy'),
 ('m)WUtJS`H&', 'uo7@ZxIP[$'),
 ('l$2O|9w`F~', 'dmsIj2JJlB'),
 ('kZ52zV#[Iv', 'eYu}=wB+0H'),
 ('i2]v|D3@:j', 'u[#kd&*}Yc'),
 ('r5C646H*+*', 'QKm&4[Vr$t'),
 ('nIfRn<aY:N', 'l2LUY9/|t]'),
 ('5S(f7%O-$', 'Dh89q.%Zv<'),
 ('m?}%V6s8]*', 'C[hSE1x])}'),
 ('uRo^w#p5Be', 'j~OT/nTkAt'),
 ('o=,%hU&yX%', 'eX^dJ|[uA*'),
 ('lq`T^ZBF2Y', 't9&OjLNz]p'),
 ('f>c7x2E]Q6', 'dn}H9%A|!j'),
 ('q[S4`,F0D=', 'K/#FG8!}DG'),
 ('jCd]`-=k,:', 'zU[B!jrpgl'),
 ('vf)G?[_?Pf', 'wOOaycR~z&'),
 ('j9:K,~DQ2v', 'HbTQZU8t9?'),
 ('ui3>b-?a@m', 'M7m8p!;nP0'),
 ('qVi;t%/`F|', 'p%wZ4zSjCt'),
 ('g-]bb&[.E!', 'o|SPdBlcOk'),
 ('f21=-A~W;~', 'neb-=f&6r^'),
 ('sT5=H|@KU|', 'pnd}~gw/:?'),
 ('lU@C3<C8Wk', 'bMw[aotLc)'),
 ('jDA-V?/hVj', 'wPY8.I+[Xh'),
 ('h_9=mkZXAH', 'cJ%(LRs3)q'),
 ('mk1VltJl<]', 'MnfK7af3~4'),
 ('c(,2{yXI#E', '>1ErI|!*U'),
 ('kkbYQXw5b;', 'w`{+uGys`~'),
 ('ia8as9sCY|', 'vxq=QA:/`z'),
 ('j%*8gN)q>d', 'N(,;S#&N9e'),
 ('bd~Ght5tLR', 'DO-=AqS[Lk'),
 ('onMKID2d;D', 'L1&JVH|{R,'),
 ('q8fF$4,c6_', 'b#r[:tRj+!'),
 ('upiX0g1quR', 'G4K|pWoffU'),
 ('n:7&>YT5A=', 'A|BG)32=10'),
 ('j2IQ=f=w3@', 'C18`2)zTm('),
 ('EWXNc<g5)', 'k[{=KKFtb8'),
 ('gFOojQO(MH', 'E8sr_C_vb['),
 ('gePC:Xt_nW', 'x4(t9J8nNQ'),
 ('vNiD6A.v#s', 'p~,(pas|?P'),
 ('?n!)c/h=Q', 'e7w}$Wx7yb'),
 ('gYIoR`|AxW', 'bK<b=p-Thp'),
 ('j<egqG@)EL', 'G{5yk85S92'),
 ('t`cagaWApo', 'w9bE`pR=z#'),
 ('jN^Vc%9OQ5', 'or<mz7dcH6'),
 ('o3VS!KWb/@', 'yRZn!>(_#b'),
 ('iR;U<J:CJJ', 'k+4CLKx35g'),
 ('i^J8&$(1]|', 'q%;R^5+|lP'),
 ('pS>DrFhd%u', 'Q]0R7JuJ6g'),
 ('t|h3|;E4g{', 'NSVN;H$s)m'),
 ('p.yv>BQ470', 'P*4KZ6]?rf'),
 ('f#4-L[mp5*', 'M}OReg^Eem'),
 ('oNpApS<AoJ', 'pRN@`OrOhv'),
 ('nsS59c`VL,', 'cIOEmhU5Nt'),
 ('m{noqE29%I', 'oK)C745Je~'),
 ('sSW/?WMy17', 'B5/<2!_D3h'),
 ('d-q4J~CNW_', 'n,VX3H7IE:'),
 ('jKO,9y0M;#', 'P>,2#H.@>i'),
 ('skOM(?n$GG', 'ELkg0G|C?W'),
 ('mi+kf0LTW.', 'b[oi-M:re$'),
 ('vgdj#X?8dB', 'qD4Ir3_WvI'),
 ('mkgcU7[bA%', 'AoE=M5R+:x'),
 ('jcu!gLw/&r', 'vlABC@3)lD'),
 ('sB7rZQsR<l', 'lalXr{5>N~'),
 ('u|I}oElaH)', 'i$+!}pvHZ('),
 ('j)i)pB*HJ,', 'l[H_#9Xj.5'),
 ('t-0>F]bu>P', 'x1I5QDSZdm'),
 ('hrI_uiW>E]', 'p]3f+<QuK['),
 ('uc61ToT%gt', 'z,yR__YX6x'),
 ('e.t$Vi5,>f', 'i3+,TcHF,N'),
 ('k/u1:B%DJH', 'G$NEO(W.(v'),
 ('e5P*D#I{m{', 'ml7O4E=o<>'),
 ('p:SPZ:e/*[', 'dryK>>pO;}'),
 ('t+v9b--,qs', 's^sd#Qsi,{'),
 ('fV`&p81%d(', 'h<BBS_PmX6'),
 ('gsS{jR,]|Q', 'p-Q-4>W#GK'),
 ('cAlyc~G.y%', 'kQssZ~b%|u'),
 ('fxAN),FAc$', 'vwR_K?gn6&'),
 ('r<N4LAAnnB', 'yV;KtlAuQ?'),
 ('e?Xq9gy=@[', 'J$+%7z?.y*'),
 ('m5j,b/y<EE', 'm=n=4WFqE3'),
 ('stRa/S(0$F', 'fFI@z-#q(E'),
 ('l+>Ki!j#v+', 'fLs!R5^k7e'),
 ('kQ:NIhJy~E', 'I%N^RyEm:/'),
 ('sY>@9w~i^p', 'ILj+.~~7_X'),
 ('mJH4kwPF.-', 'ci5EzZT?lp'),
 ('bW)ch:vs1P', 'tt:.S?c/]j'),
 ('sx|l+io`B@', 'L&YSIviD+L'),
 ('q2#Yv[O0:|', 'Kx5=:O[u*^'),
 ('lpbD0St&OU', 'f[U(U6e5OW'),
 ('mbz=7n[0v9', 'I[^T<Hq,U}'),
 ('ijP>aJBT!9', 'dV#R#|}uZH'),
 ('jI9P-f6r3M', 'B,]AC/PAz1'),
 ('h?a*UKfT_M', 'BqW}>:ZSdW'),
 ('r6BV%|..*5', 'J4zOBxF6Lw'),
 ('i)]+09JUR&', 'oM$V=]IFjW'),
 ('l}[BG9.nQS', 'bw=b(wfRVC'),
 ('mtd;>7T|g>', 'ya?+!BD<rP'),
 ('iW>m(L/~c=', 'jKTnJ!T6lc'),
 ('pkj3RPBUrF', 'Cw^_3<[mGM'),
 ('euW0jm=wfR', 'H9A(m7f1)9'),
 ('l*j*EE:!Y?', 'n%Pw}}<GAT'),
 ('d3c`&/1Y^D', 'Rb7MD6j!0|'),
 ('hXNTVF<:SH', 'fxvMT{|_3M'),
 ('mk20`,N=`=', 'Re+G*@uJCl'),
 ('eALZe^HCHq', 'vy^=B$6h^Y'),
 ('l3Ly8PBxt(', 'm<$SD/W~so'),
 ('g<[f89~U)A', 'Q7W^uZrI_<'),
 ('iIS#Nw]tr]', 'l.HYqQ_/Rf'),
 ('m{oM,jr>C#', 'zJ%%Hz#s9&'),
 ('ln^3p)j3b.', 'MWm=94b?vO'),
 ('cL?8!xP#Wj', 'm>7j+&89xI'),
 ('e=.VHQ9E+M', 'Ng%@)K)[c{'),
 ('m[96fa+HDS', 'dctSh&<iaU'),
 ('g9v~y/;=z(', 'iYAK36Cua{'),
 ('g~%pF`(x{u', 'PQ6$bI??y6'),
 ('hE5j*e,Q?[', 'Bq5H0+i]XW'),
 ('fRSM{K+;[w', 'z7wQ8s_Si['),
 ('o~}KVA:VbI', 'qqJpIWfqFB'),
 ('u-`cspdp)D', 'Ce096-Qwie'),
 ('e42BpV,P}C', 'D+L%7xa1|K'),
 ('pD<Pd$Ag@J', 'Dn/EH3[r{9'),
 ('mbGXc0y3Pe', 'g?)zvSS|6#'),
 ('gB|K:+r?1V', 'mh=!E~}0-Q'),
 ('lhWI;$JC9(', 'BGwA6-2[o8'),
 ('k0{O[6l]bH', 'xL^i{$Dd?}'),
 ('r>g<|,FWi%', 'O86#Kfnj]4'),
 ('n&>e`2FO/S', 'svzWf$x!8;'),
 ('khB~(m^@Z5', 'M,j]%f~qLY'),
 ('spKoFRM4if', 'QyNb5MKVnQ'),
 ('q8][)Ri}=q', 'hqnhi=ysa:'),
 ('hoHandbYAy', 'B4sHDjU:Pl'),
 ('lmRujD!(A7', 'GDX20ZK?Xx'),
 ('q:XyGf#>Wg', 'do3`,9Ol!H'),
 ('s#:aIK$9^x', 'Gs*[8}bP33'),
 ('jBd@A?>g|}', 'cnUAu<NuSS'),
 ('koI(}OyJ:@', 'zH)c,C{V#j'),
 ('e?gIaPc$Ox', 'yC]*G[N>gv'),
 ('o#&RMA_REo', 'u!WO.fcw8<'),
 ('s4E?ZF[E<>', 'b|Gr(/*-kx'),
 ('k1]FH+s8j@', 'k4o56u=}jw'),
 ('dWA49p}F{k', 'sk!p1OhX-1'),
 ('K*b}<I3(~', 'ipKjLUOh4Q'),
 ('e?h=Xhs+K&', 'P}MIWKA{Xz'),
 ('b@M[XTc?}5', 'k,Tmj~Pw.i'),
 ('sxOMs+bE8@', 'cep8BP*Eja'),
 ('t3aZXtpNyi', 'C00t,nt-~8'),
 ('rPekx@n9:L', 'ueNqs:h=(z'),
 ('lAxH.CfJB@', 'DNXY<9~9OH'),
 ('hZ/V/D&rO`', 'l!=SCi?>l?'),
 ('h&`>n98~V1', 'G5wA};7d`m'),
 ('t50y/[AEhF', 'la.c2n+A7e'),
 ('gBCR?!O*;E', 'sZ</&q1)tK'),
 ('tTnCoO/*tk', 'd.lZ`^MKjl'),
 ('W5?6yQZD2', 'u#*HO9?|?]'),
 ('e{e8vi@^PY', 'c^iV73&0V('),
 ('tcneuK7v%`', 'gBJKTCx_/6'),
 ('uH*Q(mcRt5', 'w0Je-<6ym_'),
 ('k$1_yaF?9#', 'o[GR>HoXjp'),
 ('dUZ^=SE5BG', 'NGD}XK^mX}'),
 ('t_h*fbN#:(', 'y[:PO%mkg('),
 ('q=w[<m2Bk&', 'z?M@Me}UrK'),
 ('vpOTK6tMr@', 'y8o-zQb(8j'),
 ('m2F|cUkKhv', 'B{LJC|+^D.'),
 ('k}4/oj#$~s', 'efA[V?^$DO'),
 ('va/ky=f5pK', 'CTw3Yd}Sx4'),
 ('c,5(mUGzYT', 'G#LLy[.iS2'),
 ('gp[h@]y13l', 'Cko(o5/eN6'),
 ('gx:;za!?C9', 'K>Dfm{ad5K'),
 ('r]*Ioa%$bK', 't@-V_iMKbK'),
 (')Y}Qy.3GK', 'G8%+Eg:Na<'),
 ('lH^2D]w;[H', 'qpx1j<_-l5'),
 ('qx%>fB$d+$', 'z|A6R3H)3B'),
 ('libliptkB4', 'J,3]AhU%0c'),
 ('jrM28*HbyG', 'jWy+dd+,ta'),
 ('r?E$4f-d0/', 'c}m%T+N!Gz'),
 ('leh^fmrt*#', 'xzc~#RzbI@'),
 ('O~pXkAbd3', 'FCE{oF+@St'),
 ('f*LO~>!0PN', 'I{.D^{85=#'),
 ('q[}7hk(+=e', 'uu)_`Q0++C'),
 ('q7do-wLx%E', 'c$J,,={OZd'),
 ('vwc3}.=Z#&', 'qhlz<GNM_8'),
 ('e<X;[vACXC', 'emq?3*tP9W'),
 ('j=L,YBvsBk', 'f2L&U-(v+/'),
 ('oa87&PB&Bm', 'Gc>|URJcg|'),
 ('b^Try&me1A', 'Dd.ED,HOi&'),
 ('o``:?0>/yz', 'J3)Ty17a?Q'),
 ('pz(G*<F93/', 'xWD+oGZ~vY'),
 ('cV4idO^r8W', 'G+c6-zDX5@'),
 ('m*PYE=#wr^', 'g;I=8p!(]b'),
 ('sXzvT.g31p', 'b_#ie@t!%Q'),
 ('mq)8`hi{hb', 'AGUPi8s%aF'),
 ('h}lnSN_f$_', 'CwGQYVm2&`'),
 ('eT<gzg?q,r', 'Hh[ZfFwkH,'),
 ('vE[T$`n9T)', 'PFcyiTRKq='),
 ('tj&bK}%P!F', 'Ql.8m|u}H!'),
 ('kX]hN=_.c-', 'k}E2,sF7^}'),
 ('r/B|ra%L,.', 'FGrbm!9:Cd'),
 ('b[(2`4t&?J', 'FMj}H;knqq'),
 ('qvITjNxkLN', 'd9@W=6sKJ-'),
 ('jX=#G8wu#(', 'F)s+:]$(EA'),
 ('l&#7I)Ah/E', 'zv#Fyq9;?1'),
 ('de=9c:,@j9', 'AJ/nnIR/[0'),
 ('kE!iKHLN_g', 'rB6=j&@4e&'),
 ('d``B*6:eCx', 'uL7#}Qw}D9'),
 ('p]t8:Tka7q', 'OawZ7gbEjw'),
 ('niJUFZF$Y:', 'D=!L6rg_pr'),
 ('p}Qa|!7PpR', 'qOB6Gi<G='),
 ('uv1fGXHN@)', 'l(DiRV,GPj'),
 ('sRw-ik:I$v', 'NH:[}beT-z'),
 ('bnEK#)[;qT', 'r8MKfCfg2E'),
 ('ey:Q|*t!Lg', 'b2PYE2BvAR'),
 ('c^,~EC6Pb2', 'nJdfBSsZq='),
 ('tMMtBUpb$&', 'ox5y>?yriv'),
 ('jKIDq|}J&c', 'P%!7{$,zCG'),
 ('dC:e5G4J/p', 't;/rK0Elxw'),
 ('u;|vR#mVMW', 's9/>8RT~Sr'),
 ('gDsLPj(9S#', 'raobJ?,rJ['),
 ('xb&P*pH(Q', 'OB:w%H&-Al'),
 ('Bszsaz0Iuo', 'IozRi;br@?'),
 ('JOT:U4ayh@', 'BidEZ1j?sA'),
 ('G/^_##fcPN', 'Q0Hf<s|zmU'),
 ('LPF4AfaHKR', 'eyVn,2@529'),
 ('rSneU!3}bn', 's>VRzs_ra_'),
 ('cv+Nq9:a<P', 'nK_Xe;yw*A'),
 ('f*2@qiHh_1', 'Fe.owPPLXj'),
 ('nuU8A_$i2M', 'v#9&oC&^gU'),
 ('fT!w8R#>dg', 'zv;#VKpiyA'),
 ('gG6SWfM>H0', 'msi&z%jb~L'),
 ('sM0GPt1HS1', 'wt&@Z9Ke*y'),
 ('dlU7VG|3Gd', 'i?3Cq]Y=6@'),
 ('cEO^y)Md[G', 'IHD#^9>(oF'),
 ('eN#^kPGv*L', 'Bc^_k/M|{V'),
 ('lp@e##m.!+', 'ePFlYQsRPh'),
 ('epvt3>HH?U', 'lQbPlI/gwj'),
 ('E3u*2.<9#`', 'c*=o}p_W/X'),
 ('q1Q3Do8S>g', 'b~m$wS)FZZ'),
 ('yX:tmrd5;]', 'x)A]S|GN_G'),
 ('H*c[ML+`s=', 'Aal{|%850}'),
 ('e_;dzXj8de', 'uge7s($h<X'),
 ('iB-8Br~onq', 'H)ax6=5vNG'),
 ('zSc]-^U=0=', 'td+]W)8y3S'),
 ('x2d4n4ADcP', 'B)~SL?|&BX'),
 ('Gn;q2Y)Xe4', 'qoQ,f:/adY'),
 ('gRVZ]qJ#>O', 'GkU[4wRj6;'),
 ('J%,fuysl*&', 'JffL}$<;]['),
 ('r(h9&#wc~B', 'nnM01DlaVX'),
 ('_]DH+g9!$', 'jH=<{Pcl+D'),
 ('B:x<p&Q=t)', 'J|aJY+vge3'),
 ('z:*d{z(~V2', 'vJUDdBqkkp'),
 ('d}R:qHj1,7', 'v/?czq&41s'),
 ('L5M1*yG7eH', 'F/|qA9Xb`f'),
 ('s|K&2S,UP|', 'f)MSa#ZHdL'),
 ('t$y1C2R-Av', 'r%;LR/o1J0'),
 ('eHJ?)TAdTo', 'w[pneW3d#g'),
 ('pQpX%(EVOH', 'lzpJ#A4I81'),
 ('qiv/4tOlf=', 'pAb@53Gk?Y'),
 ('M$bc0[jYf0', 'ufv>~I-Znw'),
 ('jYz[ibrr9m', 'u1C2Jtm-p^'),
 ('SlOEXfq#|', 'F[7BR94HX^'),
 ('d5m8%D6,;u', 'c.$2jl~n2_'),
 ('o9{x<AyA]B', 'NbC3xEVGZ}'),
 ('He!e=h?_2V', 'Iu#Jjq4.-;'),
 ('QSq%~rFaP-', 'yLhZzEnGK&'),
 ('ck!6;xK$/^', 'E2:8?ZCW`='),
 ('n{{o2K1:dw', 'zBa]c`I@&q'),
 ('xqrJ^d[.(O', 'cE|I9C6tDG'),
 ('vrn%j%6{nu', 't1~2K{sjcs'),
 ('p#R$-mG/L', 'C+sW!v-+p]'),
 ('oV/JG7fwZq', 'x-wPy%*F%3'),
 ('bD?R}i8_[c', 'J[Z3=;n.`R'),
 ('Lol+XIvY21', 'OGgh6NLJ_1'),
 ('Qlib4)q2Hk', 'Cay~/DU6[Y'),
 ('pwwZu{7f~(', 'q>RaVbPB3|'),
 ('qFuGdDx^Yv', 'A.lC&CUT?S'),
 ('Cf2@;p<aL', 'Q)zp&X@y?g'),
 ('t2&ri|[Un:', 'Hg&j8uJWA$')]

def replace_guids(mw, mapping):
    for guid_i, guid_f in mapping:
        # These should NOT be present.
        ids = mw.col.db.execute("SELECT id FROM notes WHERE guid = ?", guid_f)
        if not len(ids) == 0:
            print(f"GUID {guid_f} already exists as note id(s) {ids}!")
            print("You either already have the deck with the correct GUIDs or something's gone wrong.")
            print("Aborting GUID-replacement operation!")
            return 1
        # These should be present.
        ids = mw.col.db.execute("SELECT id FROM notes WHERE guid = ?", guid_i)
        if not len(ids) == 1:
            print(f"Warning: note with GUID {guid_i} does not exist!")
            # not aborting — the user might have simply deleted some notes
    for guid_i, guid_f in mapping:
        # Not doing everything in one go with `executemany` for readability.
        mw.col.db.executemany("UPDATE notes SET guid = ? WHERE guid = ?", [(guid_f, guid_i)])
    # We need to force a full sync!
    mw.col.db.execute("update col set scm=?", int(time.time() * 1000))
    print("GUID replacement was successful! "
          "If you use AnkiWeb, a full upload will be needed next time you sync!")
    
replace_guids(mw, guid_mapping)

If you're not familiar with the debug console, you can access it with Ctrl+Shift+;. After pasting the snippet into the top box, you can execute it with Ctrl+Enter.

After running the debug console script (and after or before the full sync — it doesn't matter), you can upgrade to v5.0 by following the normal installation/upgrade procedures.

From v4.1 ("v4.1.0")

TODO

From v4.0

Clone this wiki locally