diff --git a/superset/assets/src/SqlLab/actions/sqlLab.js b/superset/assets/src/SqlLab/actions/sqlLab.js index 870ca9169..4ec670d82 100644 --- a/superset/assets/src/SqlLab/actions/sqlLab.js +++ b/superset/assets/src/SqlLab/actions/sqlLab.js @@ -603,32 +603,34 @@ export function loadQueryEditor(queryEditor) { } export function setTables(tableSchemas) { - const tables = tableSchemas.map(tableSchema => { - const { - columns, - selectStar, - primaryKey, - foreignKeys, - indexes, - dataPreviewQueryId, - } = tableSchema.description; - return { - dbId: tableSchema.database_id, - queryEditorId: tableSchema.tab_state_id.toString(), - schema: tableSchema.schema, - name: tableSchema.table, - expanded: tableSchema.expanded, - id: tableSchema.id, - dataPreviewQueryId, - columns, - selectStar, - primaryKey, - foreignKeys, - indexes, - isMetadataLoading: false, - isExtraMetadataLoading: false, - }; - }); + const tables = tableSchemas + .filter(tableSchema => tableSchema.description !== null) + .map(tableSchema => { + const { + columns, + selectStar, + primaryKey, + foreignKeys, + indexes, + dataPreviewQueryId, + } = tableSchema.description; + return { + dbId: tableSchema.database_id, + queryEditorId: tableSchema.tab_state_id.toString(), + schema: tableSchema.schema, + name: tableSchema.table, + expanded: tableSchema.expanded, + id: tableSchema.id, + dataPreviewQueryId, + columns, + selectStar, + primaryKey, + foreignKeys, + indexes, + isMetadataLoading: false, + isExtraMetadataLoading: false, + }; + }); return { type: SET_TABLES, tables }; } diff --git a/superset/assets/src/SqlLab/reducers/getInitialState.js b/superset/assets/src/SqlLab/reducers/getInitialState.js index dbefed7db..e04f23b93 100644 --- a/superset/assets/src/SqlLab/reducers/getInitialState.js +++ b/superset/assets/src/SqlLab/reducers/getInitialState.js @@ -95,33 +95,35 @@ export default function getInitialState({ defaultDbId, ...restBootstrapData }) { const tables = []; if (activeTab) { - activeTab.table_schemas.forEach(tableSchema => { - const { - columns, - selectStar, - primaryKey, - foreignKeys, - indexes, - dataPreviewQueryId, - } = tableSchema.description; - const table = { - dbId: tableSchema.database_id, - queryEditorId: tableSchema.tab_state_id.toString(), - schema: tableSchema.schema, - name: tableSchema.table, - expanded: tableSchema.expanded, - id: tableSchema.id, - isMetadataLoading: false, - isExtraMetadataLoading: false, - dataPreviewQueryId, - columns, - selectStar, - primaryKey, - foreignKeys, - indexes, - }; - tables.push(table); - }); + activeTab.table_schemas + .filter(tableSchema => tableSchema.description !== null) + .forEach(tableSchema => { + const { + columns, + selectStar, + primaryKey, + foreignKeys, + indexes, + dataPreviewQueryId, + } = tableSchema.description; + const table = { + dbId: tableSchema.database_id, + queryEditorId: tableSchema.tab_state_id.toString(), + schema: tableSchema.schema, + name: tableSchema.table, + expanded: tableSchema.expanded, + id: tableSchema.id, + isMetadataLoading: false, + isExtraMetadataLoading: false, + dataPreviewQueryId, + columns, + selectStar, + primaryKey, + foreignKeys, + indexes, + }; + tables.push(table); + }); } const { databases, queries } = restBootstrapData; diff --git a/superset/migrations/versions/89115a40e8ea_change_table_schema_description_to_long_.py b/superset/migrations/versions/89115a40e8ea_change_table_schema_description_to_long_.py new file mode 100644 index 000000000..a1d37ab40 --- /dev/null +++ b/superset/migrations/versions/89115a40e8ea_change_table_schema_description_to_long_.py @@ -0,0 +1,50 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""Change table schema description to long text + +Revision ID: 89115a40e8ea +Revises: 5afa9079866a +Create Date: 2019-12-03 13:50:24.746867 + +""" + +# revision identifiers, used by Alembic. +revision = "89115a40e8ea" +down_revision = "5afa9079866a" + +import sqlalchemy as sa +from alembic import op +from sqlalchemy.databases import mysql +from sqlalchemy.dialects.mysql.base import MySQLDialect + + +def upgrade(): + bind = op.get_bind() + if isinstance(bind.dialect, MySQLDialect): + with op.batch_alter_table("table_schema") as batch_op: + batch_op.alter_column( + "description", existing_type=sa.Text, type_=mysql.LONGTEXT + ) + + +def downgrade(): + bind = op.get_bind() + if isinstance(bind.dialect, MySQLDialect): + with op.batch_alter_table("table_schema") as batch_op: + batch_op.alter_column( + "description", existing_type=mysql.LONGTEXT, type_=sa.Text + ) diff --git a/superset/models/sql_lab.py b/superset/models/sql_lab.py index 3b9789067..22291c7b5 100644 --- a/superset/models/sql_lab.py +++ b/superset/models/sql_lab.py @@ -259,13 +259,18 @@ class TableSchema(Model, AuditMixinNullable, ExtraJSONMixin): expanded = Column(Boolean, default=False) def to_dict(self): + try: + description = json.loads(self.description) + except json.JSONDecodeError: + description = None + return { "id": self.id, "tab_state_id": self.tab_state_id, "database_id": self.database_id, "schema": self.schema, "table": self.table, - "description": json.loads(self.description), + "description": description, "expanded": self.expanded, }