4

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

4

2 回答 2

4

我是这样做的:

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'))
于 2015-02-06T15:49:50.703 回答
1

您应该使用utf8mb4字符集,因为utf8(aka utf8mb3) is broken

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

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'
    )
于 2021-03-17T11:19:50.097 回答