weixin_39890652 2020-11-30 11:37
浏览 0

Issues when using batch_alter_table in parallel using recreate (name of the temp table is not unique)

Migrated issue, originally created by Bastien Gérard ()

Hi, I recently had the following error when using the batch_alter_table in parallel on different tables of a database. It is due to the name of the temporary table that is not unique and collides.

I'd suggest to append a unique identifier (uuid) to the name of the temp table (_alembic_batch_temp) but perhaps you'll have a better idea. As minor as it is, I'm willing to work on this :)

I'm using MySQL5.5 & alembic 0.9.3


...
  File "/home/instance/env27/lib/python2.7/site-packages/alembic/operations/base.py", line 299, in batch_alter_table
    impl.flush()
  File "/home/instance/env27/lib/python2.7/site-packages/alembic/operations/batch.py", line 82, in flush
    batch_impl._create(self.impl)
  File "/home/instance/env27/lib/python2.7/site-packages/alembic/operations/batch.py", line 246, in _create
    op_impl.create_table(self.new_table)
  File "/home/instance/env27/lib/python2.7/site-packages/alembic/ddl/impl.py", line 194, in create_table
    self._exec(schema.CreateTable(table))
  File "/home/instance/env27/lib/python2.7/site-packages/alembic/ddl/impl.py", line 118, in _exec
    return conn.execute(construct, *multiparams, **params)
  File "/home/instance/env27/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 945, in execute
    return meth(self, multiparams, params)
  File "/home/instance/env27/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", line 68, in _execute_on_connection
    return connection._execute_ddl(self, multiparams, params)
  File "/home/instance/env27/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1002, in _execute_ddl
    compiled
  File "/home/instance/env27/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1189, in _execute_context
    context)
  File "/home/instance/env27/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1402, in _handle_dbapi_exception
    exc_info
  File "/home/instance/env27/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 203, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/home/instance/env27/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context
    context)
  File "/home/instance/env27/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 470, in do_execute
    cursor.execute(statement, parameters)
  File "/home/instance/env27/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
    self.errorhandler(self, exc, value)
  File "/home/instance/env27/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
OperationalError: (_mysql_exceptions.OperationalError) (1050, "Table '_alembic_batch_temp' already exists") [SQL: u'\nCREATE TABLE _alembic_batch_temp (\n\t`_CPWP_PK_ID_` INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, \n\t`STUDYID` VARCHAR(8), \n\t`DOMAIN` VARCHAR(2), \n\t`USUBJID` VARCHAR(18), \n\t`VSSEQ` DOUBLE, \n\t`VSGRPID` VARCHAR(9), \n\t`VSTESTCD` VARCHAR(8), \n\t`VSTEST` VARCHAR(40), \n\t`VSPOS` VARCHAR(7), \n\t`VSSTRESN` DOUBLE, \n\t`VSSTRESU` VARCHAR(9), \n\t`VSSTAT` VARCHAR(8), \n\t`VSLOC` VARCHAR(11), \n\t`VSLAT` VARCHAR(5), \n\t`VSBLFL` VARCHAR(1), \n\t`VSDRVFL` VARCHAR(1), \n\t`VISITNUM` VARCHAR(255), \n\t`VISIT` VARCHAR(9), \n\t`VSDTC` VARCHAR(19), \n\t`VSDTC_DT` DOUBLE, \n\t`CP_PATIENT` VARCHAR(255), \n\t`CP_VISIT_ID` INTEGER(11), \n\t`VSDTC_DATETIME` DATETIME, \n\t`CP_CENTER` VARCHAR(255), \n\t`CP_REGION` VARCHAR(255), \n\t`CP_VISIT_NAME` VARCHAR(255), \n\t`CP_UNSCHEDULED` BIGINT, \n\tPRIMARY KEY (`_CPWP_PK_ID_`)\n)ENGINE=MyISAM DEFAULT CHARSET=utf8\n\n']

该提问来源于开源项目:sqlalchemy/alembic

  • 写回答

7条回答 默认 最新

  • weixin_39890652 2020-11-30 11:37
    关注

    Michael Bayer () wrote:

    why uuid and not the original name of the table itself?

    评论

报告相同问题?