fix: published flows now can add rows to the database (#7560)
* fix: add File model to module exports in database models * fix: remove unused relationships and imports in database models * fix: remove foreign key constraints from message, transaction, and vertex_build tables
This commit is contained in:
parent
e8cf155488
commit
077110a496
6 changed files with 80 additions and 25 deletions
|
|
@ -0,0 +1,72 @@
|
||||||
|
"""remove fk constraint in message transaction and vertex build
|
||||||
|
|
||||||
|
|
||||||
|
Revision ID: 1b8b740a6fa3
|
||||||
|
Revises: f3b2d1f1002d
|
||||||
|
Create Date: 2025-04-10 10:17:32.493181
|
||||||
|
|
||||||
|
"""
|
||||||
|
from typing import Sequence, Union
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
import sqlmodel
|
||||||
|
from sqlalchemy.engine.reflection import Inspector
|
||||||
|
from langflow.utils import migration
|
||||||
|
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision: str = '1b8b740a6fa3'
|
||||||
|
down_revision: Union[str, None] = 'f3b2d1f1002d'
|
||||||
|
branch_labels: Union[str, Sequence[str], None] = None
|
||||||
|
depends_on: Union[str, Sequence[str], None] = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade() -> None:
|
||||||
|
conn = op.get_bind()
|
||||||
|
inspector = Inspector.from_engine(conn)
|
||||||
|
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
|
||||||
|
# Handle message table
|
||||||
|
message_fks = inspector.get_foreign_keys("message")
|
||||||
|
with op.batch_alter_table('message', schema=None) as batch_op:
|
||||||
|
for fk in message_fks:
|
||||||
|
if fk.get("referred_table") == "flow" and "flow_id" in fk.get("constrained_columns", []):
|
||||||
|
constraint_name = fk.get("name")
|
||||||
|
batch_op.drop_constraint(constraint_name, type_="foreignkey")
|
||||||
|
break
|
||||||
|
|
||||||
|
# Handle transaction table
|
||||||
|
transaction_fks = inspector.get_foreign_keys("transaction")
|
||||||
|
with op.batch_alter_table('transaction', schema=None) as batch_op:
|
||||||
|
for fk in transaction_fks:
|
||||||
|
if fk.get("referred_table") == "flow" and "flow_id" in fk.get("constrained_columns", []):
|
||||||
|
constraint_name = fk.get("name")
|
||||||
|
batch_op.drop_constraint(constraint_name, type_="foreignkey")
|
||||||
|
break
|
||||||
|
|
||||||
|
# Handle vertex_build table
|
||||||
|
vertex_build_fks = inspector.get_foreign_keys("vertex_build")
|
||||||
|
with op.batch_alter_table('vertex_build', schema=None) as batch_op:
|
||||||
|
for fk in vertex_build_fks:
|
||||||
|
if fk.get("referred_table") == "flow" and "flow_id" in fk.get("constrained_columns", []):
|
||||||
|
constraint_name = fk.get("name")
|
||||||
|
batch_op.drop_constraint(constraint_name, type_="foreignkey")
|
||||||
|
break
|
||||||
|
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade() -> None:
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
with op.batch_alter_table('vertex_build', schema=None) as batch_op:
|
||||||
|
batch_op.create_foreign_key('fk_vertex_build_flow_id', 'flow', ['flow_id'], ['id'])
|
||||||
|
|
||||||
|
with op.batch_alter_table('transaction', schema=None) as batch_op:
|
||||||
|
batch_op.create_foreign_key('fk_transaction_flow_id', 'flow', ['flow_id'], ['id'])
|
||||||
|
|
||||||
|
with op.batch_alter_table('message', schema=None) as batch_op:
|
||||||
|
batch_op.create_foreign_key('fk_message_flow_id', 'flow', ['flow_id'], ['id'])
|
||||||
|
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
from .api_key import ApiKey
|
from .api_key import ApiKey
|
||||||
|
from .file import File
|
||||||
from .flow import Flow
|
from .flow import Flow
|
||||||
from .folder import Folder
|
from .folder import Folder
|
||||||
from .message import MessageTable
|
from .message import MessageTable
|
||||||
|
|
@ -6,4 +7,4 @@ from .transactions import TransactionTable
|
||||||
from .user import User
|
from .user import User
|
||||||
from .variable import Variable
|
from .variable import Variable
|
||||||
|
|
||||||
__all__ = ["ApiKey", "Flow", "Folder", "MessageTable", "TransactionTable", "User", "Variable"]
|
__all__ = ["ApiKey", "File", "Flow", "Folder", "MessageTable", "TransactionTable", "User", "Variable"]
|
||||||
|
|
|
||||||
|
|
@ -23,11 +23,8 @@ from sqlmodel import JSON, Column, Field, Relationship, SQLModel
|
||||||
from langflow.schema import Data
|
from langflow.schema import Data
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from langflow.services.database.models import TransactionTable
|
|
||||||
from langflow.services.database.models.folder import Folder
|
from langflow.services.database.models.folder import Folder
|
||||||
from langflow.services.database.models.message import MessageTable
|
|
||||||
from langflow.services.database.models.user import User
|
from langflow.services.database.models.user import User
|
||||||
from langflow.services.database.models.vertex_builds.model import VertexBuildTable
|
|
||||||
|
|
||||||
HEX_COLOR_LENGTH = 7
|
HEX_COLOR_LENGTH = 7
|
||||||
|
|
||||||
|
|
@ -190,9 +187,6 @@ class Flow(FlowBase, table=True): # type: ignore[call-arg]
|
||||||
folder_id: UUID | None = Field(default=None, foreign_key="folder.id", nullable=True, index=True)
|
folder_id: UUID | None = Field(default=None, foreign_key="folder.id", nullable=True, index=True)
|
||||||
fs_path: str | None = Field(default=None, nullable=True)
|
fs_path: str | None = Field(default=None, nullable=True)
|
||||||
folder: Optional["Folder"] = Relationship(back_populates="flows")
|
folder: Optional["Folder"] = Relationship(back_populates="flows")
|
||||||
messages: list["MessageTable"] = Relationship(back_populates="flow")
|
|
||||||
transactions: list["TransactionTable"] = Relationship(back_populates="flow")
|
|
||||||
vertex_builds: list["VertexBuildTable"] = Relationship(back_populates="flow")
|
|
||||||
|
|
||||||
def to_data(self):
|
def to_data(self):
|
||||||
serialized = self.model_dump()
|
serialized = self.model_dump()
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ from uuid import UUID, uuid4
|
||||||
|
|
||||||
from pydantic import field_serializer, field_validator
|
from pydantic import field_serializer, field_validator
|
||||||
from sqlalchemy import Text
|
from sqlalchemy import Text
|
||||||
from sqlmodel import JSON, Column, Field, Relationship, SQLModel
|
from sqlmodel import JSON, Column, Field, SQLModel
|
||||||
|
|
||||||
from langflow.schema.content_block import ContentBlock
|
from langflow.schema.content_block import ContentBlock
|
||||||
from langflow.schema.properties import Properties
|
from langflow.schema.properties import Properties
|
||||||
|
|
@ -13,7 +13,6 @@ from langflow.schema.validators import str_to_timestamp_validator
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from langflow.schema.message import Message
|
from langflow.schema.message import Message
|
||||||
from langflow.services.database.models.flow.model import Flow
|
|
||||||
|
|
||||||
|
|
||||||
class MessageBase(SQLModel):
|
class MessageBase(SQLModel):
|
||||||
|
|
@ -113,8 +112,7 @@ class MessageBase(SQLModel):
|
||||||
class MessageTable(MessageBase, table=True): # type: ignore[call-arg]
|
class MessageTable(MessageBase, table=True): # type: ignore[call-arg]
|
||||||
__tablename__ = "message"
|
__tablename__ = "message"
|
||||||
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
||||||
flow_id: UUID | None = Field(default=None, foreign_key="flow.id")
|
flow_id: UUID | None = Field(default=None)
|
||||||
flow: "Flow" = Relationship(back_populates="messages")
|
|
||||||
files: list[str] = Field(sa_column=Column(JSON))
|
files: list[str] = Field(sa_column=Column(JSON))
|
||||||
properties: Properties = Field(default_factory=lambda: Properties().model_dump(), sa_column=Column(JSON)) # type: ignore[assignment]
|
properties: Properties = Field(default_factory=lambda: Properties().model_dump(), sa_column=Column(JSON)) # type: ignore[assignment]
|
||||||
category: str = Field(sa_column=Column(Text))
|
category: str = Field(sa_column=Column(Text))
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,12 @@
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
from uuid import UUID, uuid4
|
from uuid import UUID, uuid4
|
||||||
|
|
||||||
from pydantic import field_serializer, field_validator
|
from pydantic import field_serializer, field_validator
|
||||||
from sqlmodel import JSON, Column, Field, Relationship, SQLModel
|
from sqlmodel import JSON, Column, Field, SQLModel
|
||||||
|
|
||||||
from langflow.serialization.constants import MAX_ITEMS_LENGTH, MAX_TEXT_LENGTH
|
from langflow.serialization.constants import MAX_ITEMS_LENGTH, MAX_TEXT_LENGTH
|
||||||
from langflow.serialization.serialization import serialize
|
from langflow.serialization.serialization import serialize
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from langflow.services.database.models.flow.model import Flow
|
|
||||||
|
|
||||||
|
|
||||||
class TransactionBase(SQLModel):
|
class TransactionBase(SQLModel):
|
||||||
timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
||||||
|
|
@ -20,7 +16,7 @@ class TransactionBase(SQLModel):
|
||||||
outputs: dict | None = Field(default=None, sa_column=Column(JSON))
|
outputs: dict | None = Field(default=None, sa_column=Column(JSON))
|
||||||
status: str = Field(nullable=False)
|
status: str = Field(nullable=False)
|
||||||
error: str | None = Field(default=None)
|
error: str | None = Field(default=None)
|
||||||
flow_id: UUID = Field(foreign_key="flow.id")
|
flow_id: UUID = Field()
|
||||||
|
|
||||||
# Needed for Column(JSON)
|
# Needed for Column(JSON)
|
||||||
class Config:
|
class Config:
|
||||||
|
|
@ -47,7 +43,6 @@ class TransactionBase(SQLModel):
|
||||||
class TransactionTable(TransactionBase, table=True): # type: ignore[call-arg]
|
class TransactionTable(TransactionBase, table=True): # type: ignore[call-arg]
|
||||||
__tablename__ = "transaction"
|
__tablename__ = "transaction"
|
||||||
id: UUID | None = Field(default_factory=uuid4, primary_key=True)
|
id: UUID | None = Field(default_factory=uuid4, primary_key=True)
|
||||||
flow: "Flow" = Relationship(back_populates="transactions")
|
|
||||||
|
|
||||||
|
|
||||||
class TransactionReadResponse(TransactionBase):
|
class TransactionReadResponse(TransactionBase):
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,13 @@
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
from uuid import UUID, uuid4
|
from uuid import UUID, uuid4
|
||||||
|
|
||||||
from pydantic import BaseModel, field_serializer, field_validator
|
from pydantic import BaseModel, field_serializer, field_validator
|
||||||
from sqlalchemy import Text
|
from sqlalchemy import Text
|
||||||
from sqlmodel import JSON, Column, Field, Relationship, SQLModel
|
from sqlmodel import JSON, Column, Field, SQLModel
|
||||||
|
|
||||||
from langflow.serialization.constants import MAX_ITEMS_LENGTH, MAX_TEXT_LENGTH
|
from langflow.serialization.constants import MAX_ITEMS_LENGTH, MAX_TEXT_LENGTH
|
||||||
from langflow.serialization.serialization import serialize
|
from langflow.serialization.serialization import serialize
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from langflow.services.database.models.flow.model import Flow
|
|
||||||
|
|
||||||
|
|
||||||
class VertexBuildBase(SQLModel):
|
class VertexBuildBase(SQLModel):
|
||||||
timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
||||||
|
|
@ -20,7 +16,7 @@ class VertexBuildBase(SQLModel):
|
||||||
artifacts: dict | None = Field(default=None, sa_column=Column(JSON))
|
artifacts: dict | None = Field(default=None, sa_column=Column(JSON))
|
||||||
params: str | None = Field(default=None, sa_column=Column(Text, nullable=True))
|
params: str | None = Field(default=None, sa_column=Column(Text, nullable=True))
|
||||||
valid: bool = Field(nullable=False)
|
valid: bool = Field(nullable=False)
|
||||||
flow_id: UUID = Field(foreign_key="flow.id")
|
flow_id: UUID = Field()
|
||||||
|
|
||||||
# Needed for Column(JSON)
|
# Needed for Column(JSON)
|
||||||
class Config:
|
class Config:
|
||||||
|
|
@ -58,7 +54,6 @@ class VertexBuildBase(SQLModel):
|
||||||
class VertexBuildTable(VertexBuildBase, table=True): # type: ignore[call-arg]
|
class VertexBuildTable(VertexBuildBase, table=True): # type: ignore[call-arg]
|
||||||
__tablename__ = "vertex_build"
|
__tablename__ = "vertex_build"
|
||||||
build_id: UUID | None = Field(default_factory=uuid4, primary_key=True)
|
build_id: UUID | None = Field(default_factory=uuid4, primary_key=True)
|
||||||
flow: "Flow" = Relationship(back_populates="vertex_builds")
|
|
||||||
|
|
||||||
|
|
||||||
class VertexBuildMapModel(BaseModel):
|
class VertexBuildMapModel(BaseModel):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue