如何使用alembic将MySQL表转换为utf8字符集?

时间:2014-10-04 08:49:29

标签: sqlalchemy alembic

我的数据库是MySQL。我使用SqlAlchemy ORM来定义和访问它。我使用Alembic进行迁移。我有一个模型,其中的字段过去只包含英文文本(Ascii / latin-1)。现在,该字段需要包含Unicode文本。为了转换我的模型以支持MySQL for MySQL,我需要添加以下类级别属性: mysql_character_set ='utf8'

class MyModel(Base):
    __tablename__ = 'mymodel'
    mysql_character_set = 'utf8'

    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True, nullable=False)

到目前为止一切顺利。我想将此属性添加为Alembic迁移脚本的一部分。我通常使用Alembic的优秀自动生成命令:

alembic revision --autogenerate

问题是此命令不捕获每个模型更改,特别是不添加 mysql_character_set 属性。

如何手动将此属性添加到alembic迁移脚本?

2 个答案:

答案 0 :(得分:2)

我是这样做的:

from alembic import op
import sqlalchemy as sa


def upgrade():
    conn = op.get_bind()
    conn.execute(sa.sql.text('ALTER table my_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci'))

答案 1 :(得分:1)

您应该使用 utf8mb4 字符集,因为 utf8(又名 utf8mb3)是 broken

要更改表的默认字符集将所有字符列(CHARVARCHARTEXT)转换为新字符集,您需要可以在迁移中使用 ALTER TABLE(但请参阅 docs 以了解可能的副作用):

from alembic import op


def upgrade():
   op.execute(
       'ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci'
   )

def downgrade():
    op.execute(
        'ALTER TABLE mytable CONVERT TO CHARACTER SET latin1 COLLATE latin1_swedish_ci'
    )