From 2d4e597ae47f0bdf15396821f359f2a7d7f25481 Mon Sep 17 00:00:00 2001 From: Mike Fedosin Date: Mon, 19 Jun 2017 17:20:32 +0300 Subject: [PATCH] Fix LargeBinary column type for mysql Currently sqlalchemy has a bug with mysql and LargeBinary type fails to create LongBlob and creates Blob instead [1]. As a workaround it's recommended to explicitly specify column type and size for mysql deployments [2]. [1] https://bitbucket.org/zzzeek/sqlalchemy/issues/3883/largebinary-type-fails-to-create-longblob [2] https://stackoverflow.com/questions/43791725/sqlalchemy-how-to-make-a-longblob-column-in-mysql Change-Id: I921a5ae86ced07ac0a04ba7e5dafcea07afebdb0 --- .../versions/003_add_database_blob_storage.py | 9 ++++++++- glare/db/sqlalchemy/models.py | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/glare/db/migration/alembic_migrations/versions/003_add_database_blob_storage.py b/glare/db/migration/alembic_migrations/versions/003_add_database_blob_storage.py index f4d8018..8af24f2 100644 --- a/glare/db/migration/alembic_migrations/versions/003_add_database_blob_storage.py +++ b/glare/db/migration/alembic_migrations/versions/003_add_database_blob_storage.py @@ -27,6 +27,7 @@ down_revision = '002' from alembic import op import sqlalchemy as sa +from sqlalchemy.dialects import mysql MYSQL_ENGINE = 'InnoDB' MYSQL_CHARSET = 'utf8' @@ -36,7 +37,13 @@ def upgrade(): op.create_table( 'glare_blob_data', sa.Column('id', sa.String(255), primary_key=True, nullable=False), - sa.Column('data', sa.LargeBinary(), nullable=False), + # Because of strange behavior of mysql LargeBinary is converted to + # BLOB instead of LONGBLOB. So we have to fix it explicitly with + # 'with_variant' call. + sa.Column( + 'data', + sa.LargeBinary().with_variant(mysql.LONGBLOB(), 'mysql'), + nullable=False), sa.PrimaryKeyConstraint('id'), mysql_engine=MYSQL_ENGINE, mysql_charset=MYSQL_CHARSET diff --git a/glare/db/sqlalchemy/models.py b/glare/db/sqlalchemy/models.py index a0a85b0..bc79f87 100644 --- a/glare/db/sqlalchemy/models.py +++ b/glare/db/sqlalchemy/models.py @@ -252,7 +252,7 @@ class ArtifactBlobData(BASE, ArtifactBase): __table_args__ = ( {'mysql_engine': 'InnoDB', 'mysql_charset': 'utf8'},) id = Column(String(255), primary_key=True, nullable=False) - data = Column(LargeBinary, nullable=False) + data = Column(LargeBinary(length=(2 ** 32) - 1), nullable=False) def register_models(engine):