dify icon indicating copy to clipboard operation
dify copied to clipboard

(psycopg2.errors.StringDataRightTruncation) value too long for type character varying(40)

Open engchina opened this issue 10 months ago • 3 comments

Self Checks

  • [x] This is only for bug report, if you would like to ask a question, please head to Discussions.
  • [x] I have searched for existing issues search for existing issues, including closed ones.
  • [x] I confirm that I am using English to submit this report (我已阅读并同意 Language Policy).
  • [x] [FOR CHINESE USERS] 请务必使用英文提交 Issue,否则会被关闭。谢谢!:)
  • [x] Please do not modify this template :) and fill in all the required fields.

Dify version

v1.0.0

Cloud or Self Hosted

Self Hosted (Source)

Steps to reproduce

I've created a embeddings provider of openai_api_compatible, while creating a knowledge as below,

Image

error occured

✔️ Expected Behavior

no error

❌ Actual Behavior

, I think maybe the provider_name (in this case: 'langgenius/openai_api_compatible/openai_api_compatible') is too long for provider_name colume on v1.0.0

[SQL: INSERT INTO dataset_collection_bindings (provider_name, model_name, type, collection_name) VALUES (%(provider_name)s, %(model_name)s, %(type)s, %(collection_name)s) RETURNING dataset_collection_bindings.id, dataset_collection_bindings.created_at]
[parameters: {'provider_name': 'langgenius/openai_api_compatible/openai_api_compatible', 'model_name': 'text-embedding-3-large', 'type': 'dataset', 'collection_name': 'Vector_index_77a15f7e_2571_4da5_8ed1_e76699895229_Node'}]

Full logs as below:

2025-03-01 04:52:36,358 INFO [_internal.py:97]  127.0.0.1 - - [01/Mar/2025 04:52:36] "OPTIONS /console/api/datasets/init HTTP/1.1" 200 -
2025-03-01 04:52:36,682 ERROR [app.py:875] ecfe8abce9 Exception on /console/api/datasets/init [POST]
Traceback (most recent call last):
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
    self.dialect.do_execute(
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 941, in do_execute
    cursor.execute(statement, parameters)
psycopg2.errors.StringDataRightTruncation: value too long for type character varying(40)


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

Traceback (most recent call last):
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/flask_restful/__init__.py", line 489, in wrapper
    resp = resource(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/flask/views.py", line 110, in view
    return current_app.ensure_sync(self.dispatch_request)(**kwargs)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/flask_restful/__init__.py", line 604, in dispatch_request
    resp = meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/controllers/console/wraps.py", line 147, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/libs/login.py", line 94, in decorated_view
    return current_app.ensure_sync(func)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/controllers/console/wraps.py", line 27, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/flask_restful/__init__.py", line 696, in wrapper
    resp = f(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/controllers/console/wraps.py", line 86, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/controllers/console/datasets/datasets_document.py", line 374, in post
    dataset, documents, batch = DocumentService.save_document_without_dataset_id(
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/services/dataset_service.py", line 1257, in save_document_without_dataset_id
    dataset_collection_binding = DatasetCollectionBindingService.get_dataset_collection_binding(
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/services/dataset_service.py", line 2085, in get_dataset_collection_binding
    db.session.commit()
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/scoping.py", line 597, in commit
    return self._proxied.commit()
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2028, in commit
    trans.commit(_to_root=True)
  File "<string>", line 2, in commit
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
    ret_value = fn(self, *arg, **kw)
                ^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1313, in commit
    self._prepare_impl()
  File "<string>", line 2, in _prepare_impl
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
    ret_value = fn(self, *arg, **kw)
                ^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1288, in _prepare_impl
    self.session.flush()
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 4352, in flush
    self._flush(objects)
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 4487, in _flush
    with util.safe_reraise():
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
    raise exc_value.with_traceback(exc_tb)
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 4448, in _flush
    flush_context.execute()
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py", line 466, in execute
    rec.execute(self)
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py", line 642, in execute
    util.preloaded.orm_persistence.save_obj(
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py", line 93, in save_obj
    _emit_insert_statements(
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py", line 1233, in _emit_insert_statements
    result = connection.execute(
             ^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1418, in execute
    return meth(
           ^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py", line 515, in _execute_on_connection
    return connection._execute_clauseelement(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1640, in _execute_clauseelement
    ret = self._execute_context(
          ^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1846, in _execute_context
    return self._exec_single_context(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1986, in _exec_single_context
    self._handle_dbapi_exception(
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 2355, in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
    self.dialect.do_execute(
  File "/mnt/e/workspace/dify-oracle/api/.venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 941, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.DataError: (psycopg2.errors.StringDataRightTruncation) value too long for type character varying(40)

engchina avatar Mar 01 '25 05:03 engchina

To resolve the "psycopg2.errors.StringDataRightTruncation: value too long for type character varying(40)" error, you need to increase the length of the provider_name column in the dataset_collection_bindings table. Here are the steps to do this:

  1. Connect to the Docker database container:

    docker exec -it docker-db-1 bash
    
  2. Connect to the Dify database:

    psql -d dify
    
  3. Alter the provider_name column length:

    ALTER TABLE dataset_collection_bindings ALTER COLUMN provider_name TYPE VARCHAR(255);
    
  4. Verify the change:

    \d dataset_collection_bindings;
    

This will allow longer values for the provider_name column, resolving the error you're encountering [1].

To continue talking to Dosu, mention @dosu.


Help Dosu learn! Give it feedback: Great Response | Irrelevant Answer | Incorrect Sources | Too Verbose | Hallucination | Bug Report | Other

dosubot[bot] avatar Mar 01 '25 05:03 dosubot[bot]

Thanks.

Have posted a PR https://github.com/langgenius/dify/pull/14597.

engchina avatar Mar 01 '25 05:03 engchina

hi,this is fixed on my side. but if i restart docker,the DB will cancel the change? when we just install and not need to change DB table manually?

docker exec -it docker-db-1 bash c76893cff4d1:/# psql -d dify psql (15.12) Type "help" for help.

dify=# ALTER TABLE dataset_collection_bindings ALTER COLUMN provider_name TYPE VARCHAR(255); ALTER TABLE dify=# \d dataset_collection_bindings; Table "public.dataset_collection_bindings" Column | Type | Collation | Nullable | Default -----------------+-----------------------------+-----------+----------+------------------------------ id | uuid | | not null | uuid_generate_v4() provider_name | character varying(255) | | not null | model_name | character varying(255) | | not null | collection_name | character varying(64) | | not null | created_at | timestamp without time zone | | not null | CURRENT_TIMESTAMP(0) type | character varying(40) | | not null | 'dataset'::character varying Indexes: "dataset_collection_bindings_pkey" PRIMARY KEY, btree (id) "provider_model_name_idx" btree (provider_name, model_name)

wuminmin avatar Mar 02 '25 12:03 wuminmin