Эх сурвалжийг харах

HUE-8758 [sqlalchemy] Do not error when type of column is Null

Romain 5 жил өмнө
parent
commit
8c371f886a

+ 1 - 1
desktop/core/src/desktop/lib/connectors/types.py

@@ -262,7 +262,7 @@ CONNECTOR_TYPES = [
     'description': '',
     'properties': {
       'is_sql': True,
-      'sql_identifier_quote': '`',
+      'sql_identifier_quote': '"',
       'sql_identifier_comment_single': '--',
       'has_catalog': True,
       'has_database': True,

+ 3 - 1
desktop/libs/notebook/src/notebook/connectors/sql_alchemy.py

@@ -59,6 +59,7 @@ from string import Template
 from django.utils.translation import ugettext as _
 from sqlalchemy import create_engine, inspect
 from sqlalchemy.exc import OperationalError
+from sqlalchemy.types import NullType
 
 from desktop.lib import export_csvxls
 from desktop.lib.i18n import force_unicode
@@ -296,6 +297,7 @@ class SqlAlchemyApi(Api):
       database = self._fix_phoenix_empty_database(database)
       columns = assist.get_columns(database, table)
       response['columns'] = [col['name'] for col in columns]
+
       response['extended_columns'] = [{
           'autoincrement': col.get('autoincrement'),
           'comment': col.get('comment'),
@@ -303,7 +305,7 @@ class SqlAlchemyApi(Api):
           'name': col.get('name'),
           'nullable': col.get('nullable'),
           'type': str(col.get('type'))
-        } for col in columns
+        } for col in columns if not isinstance(col.get('type'), NullType)
       ]
     else:
       columns = assist.get_columns(database, table)

+ 35 - 1
desktop/libs/notebook/src/notebook/connectors/sql_alchemy_tests.py

@@ -21,12 +21,13 @@ import logging
 import sys
 
 from nose.tools import assert_equal, assert_not_equal, assert_true, assert_false, raises
+from sqlalchemy.types import NullType
 
 from desktop.auth.backend import rewrite_user
 from desktop.lib.django_test_util import make_logged_in_client
 from useradmin.models import User
-from notebook.connectors.base import AuthenticationRequired
 
+from notebook.connectors.base import AuthenticationRequired
 from notebook.connectors.sql_alchemy import SqlAlchemyApi
 
 
@@ -222,3 +223,36 @@ class TestAutocomplete(object):
           data = SqlAlchemyApi(self.user, interpreter).autocomplete(snippet)
 
           assert_equal(data['databases'], ['SYSTEM', 'NULL'])
+
+
+  def test_columns_with_null_type(self):
+    interpreter = {
+      'options': {'url': 'phoenix://'}
+    }
+
+    snippet = Mock()
+    with patch('notebook.connectors.sql_alchemy.create_engine') as create_engine:
+      with patch('notebook.connectors.sql_alchemy.inspect') as inspect:
+        with patch('notebook.connectors.sql_alchemy.Assist') as Assist:
+          def col1_dict(key):
+            return {
+              'name': 'col1',
+            }.get(key, Mock())
+          col1 = MagicMock()
+          col1.__getitem__.side_effect = col1_dict
+          col1.get = col1_dict
+          def col2_dict(key):
+            return {
+              'name': 'col2',
+              'type': NullType()
+            }.get(key, Mock())
+          col2 = MagicMock()
+          col2.__getitem__.side_effect = col2_dict
+          col2.get = col2_dict
+
+          Assist.return_value=Mock(get_columns=Mock(return_value=[col1, col2]))
+
+          data = SqlAlchemyApi(self.user, interpreter).autocomplete(snippet, database='database', table='table')
+
+          assert_equal(data['columns'], ['col1', 'col2'])
+          assert_equal([col['name'] for col in data['extended_columns']], ['col1'])  # Skip col2