繁体   English   中英

如何将 MySQL 表转换为带有 alembic 的 utf8 字符集?

[英]How convert a MySQL table to utf8 character set with alembic?

我的数据库是 MySQL。 我使用 SqlAlchemy ORM 来定义和访问它。 我使用 Alembic 进行迁移。 我有一个 model,其字段过去只包含英文文本(Ascii/latin-1)。 现在,该字段需要包含 Unicode 文本。 In order to convert my model to support Unicode for MySQL I need to add the following class level attribute: 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

问题是这个命令没有捕获每个 model 更改,特别是没有添加mysql_character_set属性。

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

我是这样做的:

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'))

您应该使用utf8mb4字符集,因为utf8 (又名utf8mb3 )已损坏

要更改表的默认字符集转换所有字符列( CHARVARCHARTEXT ),以新的字符集,你可以使用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'
    )

只需在 MyModel class 中指定这些参数。 您还需要创建 alembic 迁移以将这些更改合并到 DB 中。

mysql_charset='utf8mb4', mysql_collate='utf8mb4_bin'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM