【问题标题】:How convert a MySQL table to utf8 character set with alembic?如何使用 alembic 将 MySQL 表转换为 utf8 字符集?
【发布时间】:2014-11-29 05:39:54
【问题描述】:

我的数据库是 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 迁移脚本?

【问题讨论】:

  • 你可以试试,我不确定。 create_engine("mysql+mysqldb://user:pass@host/dbname?charset=utf8&use_unicode=0")

标签: python mysql sqlalchemy alembic


【解决方案1】:

我是这样做的:

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

【讨论】:

    【解决方案2】:

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

    要更改表的默认字符集将所有字符列(CHARVARCHARTEXT)转换为新字符集,您可以使用ALTER TABLE in迁移(但请参阅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'
        )
    

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2011-10-27
      • 2012-07-17
      • 2015-11-21
      • 1970-01-01
      • 2017-05-18
      相关资源
      最近更新 更多