From ad7f7df21cfe5b7b8a26827afe766267f06e3d5f Mon Sep 17 00:00:00 2001 From: Michiel Scholten Date: Fri, 12 Sep 2025 17:19:11 +0200 Subject: [PATCH] Migration to sqlmodel way of doing things --- .../a8d8e45f60a1_migrate_to_sqlmodel.py | 95 +++++++++++++++++++ src/digimarks/models.py | 6 +- 2 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 migrations/versions/a8d8e45f60a1_migrate_to_sqlmodel.py diff --git a/migrations/versions/a8d8e45f60a1_migrate_to_sqlmodel.py b/migrations/versions/a8d8e45f60a1_migrate_to_sqlmodel.py new file mode 100644 index 0000000..02b8712 --- /dev/null +++ b/migrations/versions/a8d8e45f60a1_migrate_to_sqlmodel.py @@ -0,0 +1,95 @@ +"""Migrate to sqlmodel. + +Revision ID: a8d8e45f60a1 +Revises: 115bcd2e1a38 +Create Date: 2025-09-12 16:10:41.378716 + +""" +from typing import Sequence, Union + +from alembic import op +from datetime import UTC, datetime +import sqlalchemy as sa +import sqlmodel + + +# revision identifiers, used by Alembic. +revision: str = 'a8d8e45f60a1' +down_revision: Union[str, Sequence[str], None] = '115bcd2e1a38' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('bookmark', schema=None) as batch_op: + batch_op.alter_column('note', + existing_type=sa.TEXT(), + type_=sqlmodel.sql.sqltypes.AutoString(), + nullable=True, + existing_server_default=sa.text('(null)')) + batch_op.alter_column('starred', + existing_type=sa.BOOLEAN(), + nullable=False, + existing_server_default=sa.text('0')) + batch_op.alter_column('modified_date', + existing_type=sa.DATETIME(), + nullable=True) + batch_op.alter_column('deleted_date', + existing_type=sa.DATETIME(), + nullable=True, + existing_server_default=sa.text('(null)')) + batch_op.alter_column('status', + existing_type=sa.INTEGER(), + nullable=False, + existing_server_default=sa.text('0')) + batch_op.create_foreign_key('bookmark_user', 'user', ['userkey'], ['key']) + with op.batch_alter_table('publictag', schema=None) as batch_op: + batch_op.alter_column('created_date', + existing_type=sa.DATETIME(), + nullable=True, + existing_server_default=sa.text(str(datetime.now(UTC)))) + batch_op.create_foreign_key('publictag_user', 'user', ['userkey'], ['key']) + with op.batch_alter_table('user', schema=None) as batch_op: + batch_op.alter_column('theme', + existing_type=sa.VARCHAR(length=20), + nullable=False, + existing_server_default=sa.text("'green'")) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column('user', 'theme', + existing_type=sa.VARCHAR(length=20), + nullable=True, + existing_server_default=sa.text("'green'")) + op.drop_constraint(None, 'publictag', type_='foreignkey') + op.alter_column('publictag', 'created_date', + existing_type=sa.DATETIME(), + nullable=True, + existing_server_default=sa.text('(null)')) + op.drop_constraint(None, 'bookmark', type_='foreignkey') + op.alter_column('bookmark', 'status', + existing_type=sa.INTEGER(), + nullable=True, + existing_server_default=sa.text('0')) + op.alter_column('bookmark', 'deleted_date', + existing_type=sa.DATETIME(), + nullable=True, + existing_server_default=sa.text('(null)')) + op.alter_column('bookmark', 'modified_date', + existing_type=sa.DATETIME(), + nullable=True) + op.alter_column('bookmark', 'starred', + existing_type=sa.BOOLEAN(), + nullable=True, + existing_server_default=sa.text('0')) + op.alter_column('bookmark', 'note', + existing_type=sqlmodel.sql.sqltypes.AutoString(), + type_=sa.TEXT(), + nullable=True, + existing_server_default=sa.text('(null)')) + # ### end Alembic commands ### diff --git a/src/digimarks/models.py b/src/digimarks/models.py index bf1c731..bada175 100644 --- a/src/digimarks/models.py +++ b/src/digimarks/models.py @@ -69,7 +69,7 @@ class Bookmark(SQLModel, table=True): userkey: str = Field(foreign_key='user.key') title: str = Field(default='') url: AnyUrl = Field(default='', sa_type=build_custom_type(AnyUrl)) - note: str = Field(default='') + note: str = Field(default='', nullable=True) # image: str = Field(default='') url_hash: str = Field(default='') tags: str = Field(default='') @@ -80,8 +80,8 @@ class Bookmark(SQLModel, table=True): http_status: int = Field(default=HTTPStatus.OK) created_date: datetime = Field(default=datetime.now(UTC)) - modified_date: datetime = Field(default=None) - deleted_date: datetime = Field(default=None) + modified_date: datetime = Field(default=None, nullable=True) + deleted_date: datetime = Field(default=None, nullable=True) status: int = Field(default=Visibility.VISIBLE)