Michel Goldstein created AIRFLOW-3765:
-----------------------------------------

             Summary: Can't create/update xcom values using the admin UI
                 Key: AIRFLOW-3765
                 URL: https://issues.apache.org/jira/browse/AIRFLOW-3765
             Project: Apache Airflow
          Issue Type: Bug
          Components: ui
    Affects Versions: 1.10.2, 1.10.1, 1.10.0
            Reporter: Michel Goldstein
         Attachments: Screen Shot 2019-01-24 at 8.46.08 AM.png

When I try to create or update an xcom value using the admin UI I get an error 
saying:
{noformat}
Failed to create record. can't escape str to binary{noformat}
Here is the full stack trace:
{noformat}
[2019-01-24 16:50:23,781] {{view.py:1087}} ERROR - Failed to create record.
Traceback (most recent call last):
  File 
"/usr/local/airflow/.local/lib/python3.6/site-packages/flask_admin/contrib/sqla/view.py",
 line 1083, in create_model
    self.session.commit()
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/scoping.py", line 
157, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 
927, in commit
    self.transaction.commit()
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 
467, in commit
    self._prepare_impl()
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 
447, in _prepare_impl
    self.session.flush()
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 
2209, in flush
    self._flush(objects)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 
2329, in _flush
    transaction.rollback(_capture_exception=True)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", 
line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 
187, in reraise
    raise value
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 
2293, in _flush
    flush_context.execute()
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", 
line 389, in execute
    rec.execute(self)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", 
line 548, in execute
    uow
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", 
line 181, in save_obj
    mapper, table, insert)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", 
line 835, in _emit_insert_statements
    execute(statement, params)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 
945, in execute
    return meth(self, multiparams, params)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", 
line 263, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 
1053, in _execute_clauseelement
    compiled_sql, distilled_params
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 
1189, in _execute_context
    context)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 
1405, in _handle_dbapi_exception
    util.reraise(*exc_info)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 
187, in reraise
    raise value
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 
1182, in _execute_context
    context)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", 
line 470, in do_execute
    cursor.execute(statement, parameters)
TypeError: can't escape str to binary{noformat}
This seems to be related to how flask-admin and SQLAlchemy integration works. 
All the other ways to set xcom values go through XCom.set() which will handle 
the pickling of the values before passing it onto the standard SQLAlchemy 
model. However, flask-admin does not call that method and will then try to add 
a string to a binary value within the model, thus the error above.

I think the solution is to instead of provide a different "set" method, to 
declare the value type instead of a LargeBinary to provide a custom type that 
will then handle the serialization to binary 
(https://docs.sqlalchemy.org/en/rel_1_1/core/custom_types.html?highlight=typedecorator#sqlalchemy.types.TypeDecorator).



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to