From 38da7bb3a920a01d4d70fa065fd19c83ff6eecb1 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Thu, 14 May 2026 16:38:52 -0400 Subject: [PATCH] fix: drop type_key column from text_fields and datetime_fields tables (#1370) * fix: drop type_key column from text_fields and datetime_fields tables * fix: commit empty DB_VERSION 200 library * fix: use recommended renaming order for field tables --- docs/library-changes.md | 15 ++++- .../core/library/alchemy/constants.py | 2 +- src/tagstudio/core/library/alchemy/fields.py | 10 +-- src/tagstudio/core/library/alchemy/library.py | 63 ++++++++++++++++-- .../.TagStudio/ts_library.sqlite | Bin 0 -> 106496 bytes .../.TagStudio/ts_library.sqlite | Bin 114688 -> 114688 bytes tests/test_db_migrations.py | 1 + 7 files changed, 77 insertions(+), 14 deletions(-) create mode 100644 tests/fixtures/empty_libraries/DB_VERSION_201/.TagStudio/ts_library.sqlite diff --git a/docs/library-changes.md b/docs/library-changes.md index b26545d0..11e69739 100644 --- a/docs/library-changes.md +++ b/docs/library-changes.md @@ -148,9 +148,9 @@ Migration from the legacy JSON format is provided via a walkthrough when opening #### Version 200 -| Used From | Format | Location | -| --------- | ------ | ----------------------------------------------- | -| TBD | SQLite | ``/.TagStudio/ts_library.sqlite | +| Used From | Format | Location | +| ---------------------------------------------------------------------------------------------------- | ------ | ----------------------------------------------- | +| [c15e2b5](https://github.com/TagStudioDev/TagStudio/commit/c15e2b56eedd0a3c13391fa43571b8f8f7c7a91f) | SQLite | ``/.TagStudio/ts_library.sqlite | - Adds `text_field_templates` and `date_field_templates` tables. - Drops `boolean_fields` and `value_type` tables. @@ -162,3 +162,12 @@ Migration from the legacy JSON format is provided via a walkthrough when opening - Values are set to `TRUE` if the field row was previously a "TEXT_BOX" type. - Repairs existing "Description" fields inside the `text_fields` table to have their `is_multiline` column set to `TRUE` _(Previously done in [Version 7](#version-7))_. - Repairs existing "Comments" fields inside the `text_fields` table to have their `is_multiline` column set to `TRUE`. + +#### Version 201 + +| Used From | Format | Location | +| --------- | ------ | ----------------------------------------------- | +| TBD | SQLite | ``/.TagStudio/ts_library.sqlite | + +- Drops `type_key` columns from `text_fields` and `datetime_fields` tables. +- Enforces column positions for `text_fields` and `datetime_fields` tables. diff --git a/src/tagstudio/core/library/alchemy/constants.py b/src/tagstudio/core/library/alchemy/constants.py index 48ab5cbb..efe03aa2 100644 --- a/src/tagstudio/core/library/alchemy/constants.py +++ b/src/tagstudio/core/library/alchemy/constants.py @@ -9,7 +9,7 @@ JSON_FILENAME: str = "ts_library.json" DB_VERSION_CURRENT_KEY: str = "CURRENT" DB_VERSION_INITIAL_KEY: str = "INITIAL" -DB_VERSION: int = 200 +DB_VERSION: int = 201 TAG_CHILDREN_QUERY = text(""" WITH RECURSIVE ChildTags AS ( diff --git a/src/tagstudio/core/library/alchemy/fields.py b/src/tagstudio/core/library/alchemy/fields.py index 94a8e9d8..1b5e5928 100644 --- a/src/tagstudio/core/library/alchemy/fields.py +++ b/src/tagstudio/core/library/alchemy/fields.py @@ -20,15 +20,15 @@ class BaseField(Base): @declared_attr def id(self) -> Mapped[int]: - return mapped_column(primary_key=True, autoincrement=True) + return mapped_column(primary_key=True, autoincrement=True, sort_order=1) @declared_attr def name(self) -> Mapped[str]: - return mapped_column(nullable=False, default="") + return mapped_column(nullable=False, default="", sort_order=2) @declared_attr def entry_id(self) -> Mapped[int]: - return mapped_column(ForeignKey("entries.id")) + return mapped_column(ForeignKey("entries.id"), sort_order=3) @declared_attr def entry(self) -> Mapped[Entry]: @@ -47,7 +47,7 @@ class BaseField(Base): class TextField(BaseField): __tablename__ = "text_fields" - value: Mapped[str | None] + value: Mapped[str | None] = mapped_column(sort_order=4) is_multiline: Mapped[bool] = mapped_column(nullable=False, default=False) @override @@ -75,7 +75,7 @@ class TextField(BaseField): class DatetimeField(BaseField): __tablename__ = "datetime_fields" - value: Mapped[str | None] + value: Mapped[str | None] = mapped_column(sort_order=4) @override def __eq__(self, other: object) -> bool: diff --git a/src/tagstudio/core/library/alchemy/library.py b/src/tagstudio/core/library/alchemy/library.py index 9b48a8e4..bc728a99 100644 --- a/src/tagstudio/core/library/alchemy/library.py +++ b/src/tagstudio/core/library/alchemy/library.py @@ -419,6 +419,7 @@ class Library: # Under -> sqlite-the-sqlite-dialect-now-uses-nullpool-for-file-based-databases poolclass = None if storage_path == ":memory:" else NullPool loaded_db_version: int = 0 + initial_db_version: int = DB_VERSION logger.info( "[Library] Opening SQLite Library", @@ -430,6 +431,7 @@ class Library: # Don't check DB version when creating new library if not is_new: loaded_db_version = self.get_version(DB_VERSION_CURRENT_KEY) + initial_db_version = self.get_version(DB_VERSION_INITIAL_KEY) # ======================== Library Database Version Checking ======================= # DB_VERSION 6 is the first supported SQLite DB version. @@ -452,7 +454,7 @@ class Library: ), ) - logger.info(f"[Library] DB_VERSION: {loaded_db_version}") + logger.info(f"[Library] Library DB version: {loaded_db_version}") make_tables(self.engine) if is_new: @@ -571,6 +573,9 @@ class Library: self.__apply_db104_migrations(session, library_dir) if loaded_db_version < 200: self.__apply_db200_migrations(session) + # changes: field tables + if initial_db_version < 200 and loaded_db_version < 201: + self.__apply_db201_migrations(session) session.execute( text("CREATE INDEX IF NOT EXISTS idx_tags_name_shorthand ON tags (name, shorthand)") @@ -588,6 +593,7 @@ class Library: # Update DB_VERSION if loaded_db_version < DB_VERSION: + logger.info(f"[Library] Library migrated to DB version {DB_VERSION}") self.set_version(DB_VERSION_CURRENT_KEY, DB_VERSION) # everything is fine, set the library path @@ -808,10 +814,6 @@ class Library: session.execute(text("UPDATE datetime_fields SET name = type_key")) session.flush() - # TODO: Remove `type_key` columns from text_fields and datetime_fields tables. - # See issue with dropping columns foreign keys in SQLite: - # https://www.sqlite.org/lang_altertable.html#making_other_kinds_of_table_schema_changes - # Change `name` values to title case logger.info("[Library][Migration][200] Normalizing TextField names...") for text_field in session.execute(select(TextField)).scalars(): @@ -863,6 +865,57 @@ class Library: session.commit() + def __apply_db201_migrations(self, session: Session): + """Migrate DB to DB_VERSION 201.""" + with session: + create_text_fields_table = text(""" + CREATE TABLE text_fields_new ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + name VARCHAR NOT NULL, + entry_id INTEGER NOT NULL, + value VARCHAR, + is_multiline BOOLEAN NOT NULL, + FOREIGN KEY(entry_id) REFERENCES entries (id) + ) + """) + create_datetime_fields_table = text(""" + CREATE TABLE datetime_fields_new ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + name VARCHAR NOT NULL, + entry_id INTEGER NOT NULL, + value VARCHAR, + FOREIGN KEY(entry_id) REFERENCES entries (id) + ) + """) + + logger.info("[Library][Migration][201] Dropping type_key from text_fields table...") + session.execute(create_text_fields_table) + session.flush() + session.execute( + text(""" + INSERT INTO text_fields_new (id, name, entry_id, value, is_multiline) + SELECT id, name, entry_id, value, is_multiline + FROM text_fields + """) + ) + session.execute(text("DROP TABLE text_fields")) + session.execute(text("ALTER TABLE text_fields_new RENAME TO text_fields")) + + logger.info("[Library][Migration][201] Dropping type_key from datetime_fields table...") + session.execute(create_datetime_fields_table) + session.flush() + session.execute( + text(""" + INSERT INTO datetime_fields_new (id, name, entry_id, value) + SELECT id, name, entry_id, value + FROM datetime_fields + """) + ) + session.execute(text("DROP TABLE datetime_fields")) + session.execute(text("ALTER TABLE datetime_fields_new RENAME TO datetime_fields")) + + session.commit() + @property def field_templates(self) -> Sequence[BaseFieldTemplate]: with Session(self.engine) as session: diff --git a/tests/fixtures/empty_libraries/DB_VERSION_201/.TagStudio/ts_library.sqlite b/tests/fixtures/empty_libraries/DB_VERSION_201/.TagStudio/ts_library.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..530a34ffe58d4616b10427830c1fa5c411cceb9f GIT binary patch literal 106496 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/search_library/.TagStudio/ts_library.sqlite b/tests/fixtures/search_library/.TagStudio/ts_library.sqlite index 4d520f076a574893f9bbac9063c4c37b4426d91d..5389a26e1071e8c0fcc40a95bfab9779f0bb0c6d 100644 GIT binary patch delta 3827 zcmd^>d2Ce29mjXxo4xnVZ`a0N~DAvEhFK+547iv&x=dGS8mTOPY)y>>uV zSO+0RfhyOkb*rB0m5Ms3#leP>G&HHI7Nrq1Z58#RO{*v&K)6gW2Hct7*pcJ7{ijl; zs4MyV+4;?He!n+w_UHKx3^)e{oX_M0#%wlQF8`bU6g^v2ziP}@(|^#;O#~*yL=H@_ zc2?=T;5+8s?yVu~-9zqn*LK$eXRYIgquM@X{{lTh{mS=AC{^fx{vk)61LN)6=643` z>&gCY3FBeQ3>yhE5!q>WbVW=n+}jbe!gH7cjjhe0wr0I8)UcshFPg)nDD{TDYcM%V zG6wrc$dl^6p4`C`L!^i}Q!dviLcpZKTC*h~?A{>Sv!gt{7@MU-g4#0lc3%el>7IeWw&<<^|3D!XatcImf z2MeJD@*xY-zy}Vnv777~yU5;UZ?iwMKd{s66#E7H89T;~upyq*W*aW?m$9T>C8T&I z>I&55LW`E6E=65}x>#soJ?dSki%{!?>b0mfsMV-dLJKNU7ot|6mJ7`-LtS7`@s2=&hs3hAh6 zLRrABCOQ0KpaCiq>eGaJeW+fc4v$c~8`UM0I#C@$RXZvbs;H=ns=D18f6HEXyA2+J z)$GZc^Zid^|8;h2ifOX6I;%zna(nq zT^rZVYk$+;)PAL%(0-(SOM6b+%MUS2OQzE@P1$BzR_sxIbKHn_o9ZwW-HQfQVkbxjBuYDjBkZ(G?NKKZ!@}k6^-U-%0{D` z2Qa9LjvM$bq+Z7d+YssQN$8mNg8(ho6lqu+H_fQ};S3k?UepUSTpHrBN2Am=!=-`W z66!5R^LP{^*>6U}W}FgyOc`$+vty+5KJMne*XWPM`2pZFHd|I?SFcIaaMWaW8GTkl zeGiYO$%ya3qfy_-ggBN@;J~1bdyJ?$fxeBgn5C~xigWZ~^2V4Ii&HGG`Q41i_fQ3$LVXYS#iP_NcIFB> z0YLj4{UPTOFN-!i9%11+yYX_~55x@O(&ps2+pVeU>$H3-V+SS`8TL4G}Y z^=bZ}vYyutbMX64Wv^?$*S_g{)7R=N^ctQK_h((I^J~t9j^p;f+YiyR^g&v!?o?hS z_w!09CZE~{;fqQ#raOao7n8@m5&r&nN5Z>15=M6i|0%~KW-oG2M?~ zmG2C$${>%sXKt~#BWmzYacgf+ES~5wqGF4^)2-ph_BQ4Dk>gaNUcFpIsM0^0sMyz> z=L}X>lKr97Q}$xw8a#WH6#Vz?V%_Y1Q2)>EqU;Mlmbc>5+QObyv6H+{o3z0Me8@Y= z_uy^#6Z{T-!~4ir;28V_4#9VM7x^W43Z8%g*u#6s9sHu(4qIU}?;u0466&D}N_qbn z1V6YzVH5n~yTIOIXW3i)`a8v5V=u9z{1SYgeVcuiUxWwwRrna|XED~p@(kYFY+)N% zGh4%!u{u`4idYVt$28{9CVBmLYDtHx5Sn(M#Ck+voy1xMyBDD~OEgI|B76-JA&Gks z-p@#^k+>T{R!gjsSc$N$a3n=~+j2QvCZJ9(l~^LN7;&dw;x36rh}(6DTeT8364i)_ zDv3&og@~IK66F$Q4mHUWjxWIBc&S7Q;zqGVkwhWlx-L;5k&hV5LtM+1$U$7qmY6S* zg}4%w$dt(7ND}q(JRDw1mq?QcAU^O*fCNKa)DRbZ5?%=p;=EhJCE-N8?~t%dP{cV^ Lw8D0(x`^^GiO*uh delta 2922 zcmd5;Pi)&%825`CCw6SVq+RN!P2033tkDW=D%1Ekz)ek;HHky)jICm1S?jG))22(( ziE&9+wgVsm!v_n51WcW@vK6T-FvfumH~^ZMIBf#~g997@l>?d>8e=@$iPKhafD0sX zV!!u$-}k-m`+YCJ>1oIGwBz{}&k}}Vesn=};pp-m>FM3Ngx$XX89RCc@H+a&{O~%o zvlki2EYS)2GW8YRLQ2#dPJ%dZKUCL^U$h;?UjZfC7&Zs5=?kovc4Zcv*S~Ax4YIaF43ETt=FaA5B=&zn%jKP?lfXQ_^=VnWI@@Z6qJc!rMT>t zToFZWLOU`Gf^}OZF|I9~1f8~xr1t7O@XIwsF}-2g19k9G!ohWPfG2Uon;yNAE*+Ru zYIlwmzG~y@H}*F50`!G-cwif!3~%9+-FJrqaZwJ$Q_*NofFiTS^oX)2GnFd^`b04* z@bMMXtElHPb2vzk?sc*Wn9r3?^U?Y+!$2&$2JE%5)eEv0r z&xc%X6Qik^uq~gP8n0Ps3N;XG*S0!AxgW7SofJ^XB%!}QQ&Iv+1$9MH8PR9tNKD{D z^(NMUrV>$+@2@~plev6mqy}yDdrYU2m`a8PDL+*ht~vEKy9tg%A;tLk03XXt?9IsK zYMR&hVP&b1j0lpX6tYUK2o24wxfGQt5=Irs4qH2|Z(<0q7nw!O8|=&H$E+F8I+_TD z&@PS0t2sA!S;>337ChVKB04&%Xqg`r;zmB?%$PD!O$HO9mL(%5_D3FyRFVl3%zgLa~;OSdaX;bbJC8|YVx!-ec*)kHasaCMD!L_-70 zU@93!AImiE$IY6UlwL(R+x74#I0P49f}LmIg~y==55r+d!~L)ge!_mleh=@3XW7e8fa~F}@N)=I*Y0D> zG~Q};Y;)zoXilFS53cCLCI)Y>wHv2nt9{j|PgyPGrEp)RS=M;)wI*k(jnQC@82m4z z2B_EZCeJ-2&Y7fk8-oUep+0EPm387?gPcq~9$Ljkn#DWJA%k!(%TJYBl)fQ@zZC|N z$Xd!6aq96~%y8)b3=R+w?^<4Ry8~~~OIxQ0XO1a0KAI9tH}J1@buL?z>PHc`1CK&0oL75CoqbXFnA~YknPg7M^$ss z?-1v!@73A^dmO!MFI{`|Y8@xRhE*!W9)j2Ec4?oz0ot^4^Po{zBz5o_-lGro{x`a0 zhe#(t?EfN6kcu1CMb*C-CZsM*0`ZwqsKw_%XHAwJ*4{e-TGa~_s}9ovb`RUw+CnTn7Z+>scuHl30lgI zE4r|o8LUXk*m6m^I12#KJ~#?aES@B1z-dI3D>y2Cl48$bFI%egX(!R53k?j@GAF<} NbZ&uxf1poy{0RkxD>488 diff --git a/tests/test_db_migrations.py b/tests/test_db_migrations.py index 7dee6b6c..87ef3574 100644 --- a/tests/test_db_migrations.py +++ b/tests/test_db_migrations.py @@ -30,6 +30,7 @@ EMPTY_LIBRARIES = "empty_libraries" # str(Path(CWD.parent / FIXTURES / EMPTY_LIBRARIES / "DB_VERSION_102")), str(Path(CWD.parent / FIXTURES / EMPTY_LIBRARIES / "DB_VERSION_103")), str(Path(CWD.parent / FIXTURES / EMPTY_LIBRARIES / "DB_VERSION_200")), + str(Path(CWD.parent / FIXTURES / EMPTY_LIBRARIES / "DB_VERSION_201")), ], ) def test_library_migrations(path: str):