You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by be...@apache.org on 2020/10/27 15:49:27 UTC
[incubator-superset] branch master updated: feat: add UUID column
to saved_query for export/import (#11397)
This is an automated email from the ASF dual-hosted git repository.
beto pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
The following commit(s) were added to refs/heads/master by this push:
new 98daf0a feat: add UUID column to saved_query for export/import (#11397)
98daf0a is described below
commit 98daf0a4354d9be8efdada1358d4f4363f4dc96b
Author: Beto Dealmeida <ro...@dealmeida.net>
AuthorDate: Tue Oct 27 08:49:09 2020 -0700
feat: add UUID column to saved_query for export/import (#11397)
* Add UUID to saved_query
* Reuse function from previous migration
* Point to new head
---
...6e99fb176a0_add_import_mixing_to_saved_query.py | 93 ++++++++++++++++++++++
...b56500de1855_add_uuid_column_to_import_mixin.py | 8 +-
superset/models/sql_lab.py | 13 ++-
3 files changed, 108 insertions(+), 6 deletions(-)
diff --git a/superset/migrations/versions/96e99fb176a0_add_import_mixing_to_saved_query.py b/superset/migrations/versions/96e99fb176a0_add_import_mixing_to_saved_query.py
new file mode 100644
index 0000000..2dc38e2
--- /dev/null
+++ b/superset/migrations/versions/96e99fb176a0_add_import_mixing_to_saved_query.py
@@ -0,0 +1,93 @@
+# 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.
+"""add_import_mixing_to_saved_query
+
+Revision ID: 96e99fb176a0
+Revises: 585b0b1a7b18
+Create Date: 2020-10-21 21:09:55.945956
+
+"""
+
+import os
+from uuid import uuid4
+
+import sqlalchemy as sa
+from alembic import op
+from sqlalchemy.exc import OperationalError
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy_utils import UUIDType
+
+from superset import db
+from superset.migrations.versions.b56500de1855_add_uuid_column_to_import_mixin import (
+ add_uuids,
+)
+
+# revision identifiers, used by Alembic.
+revision = "96e99fb176a0"
+down_revision = "585b0b1a7b18"
+
+
+Base = declarative_base()
+
+
+class ImportMixin:
+ id = sa.Column(sa.Integer, primary_key=True)
+ uuid = sa.Column(UUIDType(binary=True), primary_key=False, default=uuid4)
+
+
+class SavedQuery(Base, ImportMixin):
+ __tablename__ = "saved_query"
+
+
+default_batch_size = int(os.environ.get("BATCH_SIZE", 200))
+
+
+def upgrade():
+ bind = op.get_bind()
+ session = db.Session(bind=bind)
+
+ # Add uuid column
+ try:
+ with op.batch_alter_table("saved_query") as batch_op:
+ batch_op.add_column(
+ sa.Column(
+ "uuid", UUIDType(binary=True), primary_key=False, default=uuid4,
+ ),
+ )
+ except OperationalError:
+ # Ignore column update errors so that we can run upgrade multiple times
+ pass
+
+ add_uuids(SavedQuery, "saved_query", session)
+
+ try:
+ # Add uniqueness constraint
+ with op.batch_alter_table("saved_query") as batch_op:
+ # Batch mode is required for sqllite
+ batch_op.create_unique_constraint("uq_saved_query_uuid", ["uuid"])
+ except OperationalError:
+ pass
+
+
+def downgrade():
+ bind = op.get_bind()
+ session = db.Session(bind=bind)
+
+ # Remove uuid column
+ with op.batch_alter_table("saved_query") as batch_op:
+ batch_op.drop_constraint("uq_saved_query_uuid", type_="unique")
+ batch_op.drop_column("uuid")
diff --git a/superset/migrations/versions/b56500de1855_add_uuid_column_to_import_mixin.py b/superset/migrations/versions/b56500de1855_add_uuid_column_to_import_mixin.py
index bffa983..5600212 100644
--- a/superset/migrations/versions/b56500de1855_add_uuid_column_to_import_mixin.py
+++ b/superset/migrations/versions/b56500de1855_add_uuid_column_to_import_mixin.py
@@ -86,10 +86,10 @@ add_uuids_by_dialect = {
}
-def add_uuids(table_name, session, batch_size=default_batch_size):
+def add_uuids(model, table_name, session, batch_size=default_batch_size):
"""Populate columns with pre-computed uuids"""
bind = op.get_bind()
- objects_query = session.query(models[table_name])
+ objects_query = session.query(model)
count = objects_query.count()
# silently skip if the table is empty (suitable for db initialization)
@@ -168,7 +168,7 @@ def upgrade():
bind = op.get_bind()
session = db.Session(bind=bind)
- for table_name in models.keys():
+ for table_name, model in models.items():
try:
with op.batch_alter_table(table_name) as batch_op:
batch_op.add_column(
@@ -180,7 +180,7 @@ def upgrade():
# ignore collumn update errors so that we can run upgrade multiple times
pass
- add_uuids(table_name, session)
+ add_uuids(model, table_name, session)
try:
# add uniqueness constraint
diff --git a/superset/models/sql_lab.py b/superset/models/sql_lab.py
index f7f8f86..6c805b2 100644
--- a/superset/models/sql_lab.py
+++ b/superset/models/sql_lab.py
@@ -39,7 +39,7 @@ from sqlalchemy.engine.url import URL
from sqlalchemy.orm import backref, relationship
from superset import security_manager
-from superset.models.helpers import AuditMixinNullable, ExtraJSONMixin
+from superset.models.helpers import AuditMixinNullable, ExtraJSONMixin, ImportMixin
from superset.models.tags import QueryUpdater
from superset.sql_parse import CtasMethod, ParsedQuery, Table
from superset.utils.core import QueryStatus, user_label
@@ -162,7 +162,7 @@ class Query(Model, ExtraJSONMixin):
security_manager.raise_for_access(query=self)
-class SavedQuery(Model, AuditMixinNullable, ExtraJSONMixin):
+class SavedQuery(Model, AuditMixinNullable, ExtraJSONMixin, ImportMixin):
"""ORM model for SQL query"""
__tablename__ = "saved_query"
@@ -186,6 +186,15 @@ class SavedQuery(Model, AuditMixinNullable, ExtraJSONMixin):
rows = Column(Integer, nullable=True)
last_run = Column(DateTime, nullable=True)
+ export_parent = "database"
+ export_fields = [
+ "db_id",
+ "schema",
+ "label",
+ "description",
+ "sql",
+ ]
+
def __repr__(self) -> str:
return str(self.label)