Skip to content

v1.8.2 升级到 v1.8.3 ,进行脚本迁移的时候报错 #424

@zhuzhaoyun

Description

@zhuzhaoyun

Pre-checks

Deployment Method

Docker

Steps to Reproduce

1、git pull origin main

2、docker exec clawith-backend-1 alembic upgrade heads

Expected vs Actual Behavior

报错
docker exec clawith-backend-1 alembic upgrade heads
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> add_quota_fields, Add usage quota fields to users, agents, and tenants tables.
INFO [alembic.runtime.migration] Running upgrade add_quota_fields -> add_agent_tool_source, Add source and installed_by_agent_id to agent_tools
INFO [alembic.runtime.migration] Running upgrade add_agent_tool_source -> add_chat_sessions, Add chat_sessions table and update existing chat_messages conversation_ids.
INFO [alembic.runtime.migration] Running upgrade add_chat_sessions -> add_invitation_codes, Add invitation_codes table.
INFO [alembic.runtime.migration] Running upgrade add_invitation_codes -> add_participants, Add participants table, extend chat_sessions and chat_messages, migrate messages data, drop messages table.
Traceback (most recent call last):
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 526, in _prepare_and_execute
prepared_stmt, attributes = await adapt_connection._prepare(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 773, in _prepare
prepared_stmt = await self._connection.prepare(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 638, in prepare
return await self._prepare(
^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 657, in _prepare
stmt = await self._get_statement(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 443, in _get_statement
statement = await self._protocol.prepare(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "asyncpg/protocol/protocol.pyx", line 165, in prepare
asyncpg.exceptions.UndefinedColumnError: column "username" does not exist

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
self.dialect.do_execute(
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
cursor.execute(statement, parameters)
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 585, in execute
self.adapt_connection.await(
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
value = await result
^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 563, in _prepare_and_execute
self._handle_exception(error)
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 513, in _handle_exception
self._adapt_connection._handle_exception(error)
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 797, in _handle_exception
raise translated_error from error
sqlalchemy.dialects.postgresql.asyncpg.AsyncAdapt_asyncpg_dbapi.ProgrammingError: <class 'asyncpg.exceptions.UndefinedColumnError'>: column "username" does not exist

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/usr/local/bin/alembic", line 8, in
sys.exit(main())
^^^^^^
File "/usr/local/lib/python3.12/site-packages/alembic/config.py", line 1047, in main
CommandLine(prog=prog).main(argv=argv)
File "/usr/local/lib/python3.12/site-packages/alembic/config.py", line 1037, in main
self.run_cmd(cfg, options)
File "/usr/local/lib/python3.12/site-packages/alembic/config.py", line 971, in run_cmd
fn(
File "/usr/local/lib/python3.12/site-packages/alembic/command.py", line 483, in upgrade
script.run_env()
File "/usr/local/lib/python3.12/site-packages/alembic/script/base.py", line 545, in run_env
util.load_python_file(self.dir, "env.py")
File "/usr/local/lib/python3.12/site-packages/alembic/util/pyfiles.py", line 116, in load_python_file
module = load_module_py(module_id, path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/alembic/util/pyfiles.py", line 136, in load_module_py
spec.loader.exec_module(module) # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "", line 999, in exec_module
File "", line 488, in _call_with_frames_removed
File "/app/alembic/env.py", line 85, in
run_migrations_online()
File "/app/alembic/env.py", line 79, in run_migrations_online
asyncio.run(run_async_migrations())
File "/usr/local/lib/python3.12/asyncio/runners.py", line 195, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "/app/alembic/env.py", line 73, in run_async_migrations
await connection.run_sync(do_run_migrations)
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py", line 888, in run_sync
return await greenlet_spawn(
^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 203, in greenlet_spawn
result = context.switch(value)
^^^^^^^^^^^^^^^^^^^^^
File "/app/alembic/env.py", line 62, in do_run_migrations
context.run_migrations()
File "", line 8, in run_migrations
File "/usr/local/lib/python3.12/site-packages/alembic/runtime/environment.py", line 969, in run_migrations
self.get_context().run_migrations(**kw)
File "/usr/local/lib/python3.12/site-packages/alembic/runtime/migration.py", line 626, in run_migrations
step.migration_fn(**kw)
File "/app/alembic/versions/add_participants.py", line 33, in upgrade
conn.execute(sa.text("""
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1419, in execute
return meth(
^^^^^
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/sql/elements.py", line 527, in _execute_on_connection
return connection._execute_clauseelement(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1641, in _execute_clauseelement
ret = self._execute_context(
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1846, in _execute_context
return self._exec_single_context(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1986, in _exec_single_context
self._handle_dbapi_exception(
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 2363, in _handle_dbapi_exception
raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
self.dialect.do_execute(
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
cursor.execute(statement, parameters)
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 585, in execute
self.adapt_connection.await(
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
value = await result
^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 563, in _prepare_and_execute
self._handle_exception(error)
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 513, in _handle_exception
self._adapt_connection._handle_exception(error)
File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 797, in _handle_exception
raise translated_error from error
sqlalchemy.exc.ProgrammingError: (sqlalchemy.dialects.postgresql.asyncpg.ProgrammingError) <class 'asyncpg.exceptions.UndefinedColumnError'>: column "username" does not exist
[SQL:
INSERT INTO participants (id, type, ref_id, display_name, avatar_url)
SELECT gen_random_uuid(), 'user', id, COALESCE(display_name, username), avatar_url
FROM users
ON CONFLICT DO NOTHING
]

我去查看数据,发现确实没有这个字段 username
docker exec -it $(docker ps -qf "name=postgres") psql -U clawith -d clawith -c "\d users"
Table "public.users"
Column | Type | Collation | Nullable | Default
-----------------------+--------------------------+-----------+----------+---------
id | uuid | | not null |
identity_id | uuid | | |
tenant_id | uuid | | |
display_name | character varying(100) | | not null |
avatar_url | character varying(500) | | |
title | character varying(100) | | |
role | user_role_enum | | not null |
is_active | boolean | | not null |
registration_source | character varying(50) | | |
created_at | timestamp with time zone | | not null | now()
updated_at | timestamp with time zone | | not null | now()
quota_message_limit | integer | | not null |
quota_message_period | character varying(20) | | not null |
quota_messages_used | integer | | not null |
quota_period_start | timestamp with time zone | | |
quota_max_agents | integer | | not null |
quota_agent_ttl_hours | integer | | not null |
Indexes:
"users_pkey" PRIMARY KEY, btree (id)
"ix_users_identity_id" btree (identity_id)
Foreign-key constraints:
"users_identity_id_fkey" FOREIGN KEY (identity_id) REFERENCES identities(id)
"users_tenant_id_fkey" FOREIGN KEY (tenant_id) REFERENCES tenants(id)
Referenced by:
TABLE "agent_schedules" CONSTRAINT "agent_schedules_created_by_fkey" FOREIGN KEY (created_by) REFERENCES users(id)
TABLE "agent_templates" CONSTRAINT "agent_templates_created_by_fkey" FOREIGN KEY (created_by) REFERENCES users(id)
TABLE "agents" CONSTRAINT "agents_creator_id_fkey" FOREIGN KEY (creator_id) REFERENCES users(id)
TABLE "approval_requests" CONSTRAINT "approval_requests_resolved_by_fkey" FOREIGN KEY (resolved_by) REFERENCES users(id)
TABLE "audit_logs" CONSTRAINT "audit_logs_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id)
TABLE "chat_messages" CONSTRAINT "chat_messages_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id)
TABLE "chat_sessions" CONSTRAINT "chat_sessions_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id)
TABLE "enterprise_info" CONSTRAINT "enterprise_info_updated_by_fkey" FOREIGN KEY (updated_by) REFERENCES users(id)
TABLE "gateway_messages" CONSTRAINT "gateway_messages_sender_user_id_fkey" FOREIGN KEY (sender_user_id) REFERENCES users(id)
TABLE "invitation_codes" CONSTRAINT "invitation_codes_created_by_fkey" FOREIGN KEY (created_by) REFERENCES users(id)
TABLE "notifications" CONSTRAINT "notifications_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id)
TABLE "published_pages" CONSTRAINT "published_pages_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id)
TABLE "tasks" CONSTRAINT "tasks_created_by_fkey" FOREIGN KEY (created_by) REFERENCES users(id)
TABLE "tasks" CONSTRAINT "tasks_supervision_target_user_id_fkey" FOREIGN KEY (supervision_target_user_id) REFERENCES users(id)

Logs / Screenshots

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions