我的数据库是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迁移脚本中?
我是这样做的:
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
)已损坏。
要更改表的默认字符集并将所有字符列(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'
)
只需在MyModel类中指定这些参数。您还需要创建alembic迁移,以便将这些更改合并到DB中。
mysql_charset='utf8mb4', mysql_collate='utf8mb4_bin'