From 10d03360c501bd950623425fb1c554b6254103e8 Mon Sep 17 00:00:00 2001 From: Marcelo Nunes Alves <35287700+MarceloNunesAlves@users.noreply.github.com> Date: Thu, 29 Aug 2024 16:10:42 -0300 Subject: [PATCH] fix: Problem in the description field when using the MariaDB or MySQL (#3431) * fix: Problem in the description field when using the MariaDB or MySQL database. * fix: Problem in the description field when using the MariaDB or MySQL database. * fix: Add the migration script to update description columns type. * [autofix.ci] apply automated fixes * Update src/backend/base/langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py Co-authored-by: Gabriel Luiz Freitas Almeida --------- Co-authored-by: Marcelo Nunes Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Gabriel Luiz Freitas Almeida --- ...8a0efe1_update_description_columns_type.py | 70 +++++++++++++++++++ .../services/database/models/flow/model.py | 4 +- .../services/database/models/folder/model.py | 6 +- 3 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 src/backend/base/langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py diff --git a/src/backend/base/langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py b/src/backend/base/langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py new file mode 100644 index 000000000000..1f9426a5bbb4 --- /dev/null +++ b/src/backend/base/langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py @@ -0,0 +1,70 @@ +"""Update description columns type + +Revision ID: 4522eb831f5c +Revises: 0d60fcbd4e8e +Create Date: 2024-08-20 11:46:56.266061 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op +from langflow.utils import migration +from sqlalchemy.engine.reflection import Inspector + +# revision identifiers, used by Alembic. +revision: str = "4522eb831f5c" +down_revision: Union[str, None] = "0d60fcbd4e8e" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + conn = op.get_bind() + # ### commands auto generated by Alembic - please adjust! ### + inspector = Inspector.from_engine(conn) # type: ignore + + with op.batch_alter_table("flow", schema=None) as batch_op: + if migration.column_exists(table_name="flow", column_name="description", conn=conn): + columns = inspector.get_columns("flow") + description_column = next((column for column in columns if column["name"] == "description"), None) + if description_column is not None and isinstance(description_column["type"], sa.VARCHAR): + batch_op.alter_column( + "description", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=True + ) + + with op.batch_alter_table("folder", schema=None) as batch_op: + if migration.column_exists(table_name="folder", column_name="description", conn=conn): + columns = inspector.get_columns("folder") + description_column = next((column for column in columns if column["name"] == "description"), None) + if description_column is not None and isinstance(description_column["type"], sa.VARCHAR): + batch_op.alter_column( + "description", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=True + ) + + # ### end Alembic commands ### + + +def downgrade() -> None: + conn = op.get_bind() + # ### commands auto generated by Alembic - please adjust! ### + inspector = Inspector.from_engine(conn) # type: ignore + with op.batch_alter_table("folder", schema=None) as batch_op: + if migration.column_exists(table_name="folder", column_name="description", conn=conn): + columns = inspector.get_columns("folder") + description_column = next((column for column in columns if column["name"] == "description"), None) + if description_column is not None and isinstance(description_column["type"], sa.VARCHAR): + batch_op.alter_column( + "description", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=True + ) + + with op.batch_alter_table("flow", schema=None) as batch_op: + if migration.column_exists(table_name="flow", column_name="description", conn=conn): + columns = inspector.get_columns("flow") + description_column = next((column for column in columns if column["name"] == "description"), None) + if description_column is not None and isinstance(description_column["type"], sa.VARCHAR): + batch_op.alter_column( + "description", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=True + ) + # ### end Alembic commands ### diff --git a/src/backend/base/langflow/services/database/models/flow/model.py b/src/backend/base/langflow/services/database/models/flow/model.py index 22c2d2f904df..11ce012524f2 100644 --- a/src/backend/base/langflow/services/database/models/flow/model.py +++ b/src/backend/base/langflow/services/database/models/flow/model.py @@ -10,7 +10,7 @@ from emoji import purely_emoji # type: ignore from fastapi import HTTPException, status from pydantic import field_serializer, field_validator -from sqlalchemy import UniqueConstraint +from sqlalchemy import UniqueConstraint, Text from sqlmodel import JSON, Column, Field, Relationship, SQLModel from langflow.schema import Data @@ -25,7 +25,7 @@ class FlowBase(SQLModel): name: str = Field(index=True) - description: Optional[str] = Field(index=True, nullable=True, default=None) + description: Optional[str] = Field(default=None, sa_column=Column(Text, index=True, nullable=True)) icon: Optional[str] = Field(default=None, nullable=True) icon_bg_color: Optional[str] = Field(default=None, nullable=True) data: Optional[Dict] = Field(default=None, nullable=True) diff --git a/src/backend/base/langflow/services/database/models/folder/model.py b/src/backend/base/langflow/services/database/models/folder/model.py index 73ba6a6e54cc..1e627c3c9f7f 100644 --- a/src/backend/base/langflow/services/database/models/folder/model.py +++ b/src/backend/base/langflow/services/database/models/folder/model.py @@ -1,8 +1,8 @@ from typing import TYPE_CHECKING, List, Optional from uuid import UUID, uuid4 -from sqlalchemy import UniqueConstraint -from sqlmodel import Field, Relationship, SQLModel +from sqlalchemy import UniqueConstraint, Text +from sqlmodel import Field, Relationship, SQLModel, Column from langflow.services.database.models.flow.model import FlowRead @@ -13,7 +13,7 @@ class FolderBase(SQLModel): name: str = Field(index=True) - description: Optional[str] = Field(default=None) + description: Optional[str] = Field(default=None, sa_column=Column(Text)) class Folder(FolderBase, table=True): # type: ignore