mysql支持UUID做外键_多表外键下将普通的id主键更新为uuid主键

本文介绍了如何在保持多表外键约束的情况下,使用Flask-SQLAlchemy和SQL语句将MySQL中的自增id主键替换为UUID主键。涉及步骤包括检查和删除外键、修改表结构、更新数据、迁移Flask模型以及处理数据库迁移错误。还提供了数据回滚的方法。
摘要由CSDN通过智能技术生成

多表外键下将普通的id主键更新为uuid主键

2019-05-20 02:45:37 来源: 晴天小雨

0

摘要:在多表外键影响和保证数据不删除的前提下,借助Flask-sqlalchemy插件及SQL语句,将MySQL中的普通id自增主键更新为uuid主键。

MySQL相关操作

查看指定表相关的外键和表格

mysql>select table_name, constraint_name, referenced_table_name

->from information_schema.key_column_usage where referenced_table_name="article";

根据查询到的外键名constraint_name以及table_name,依次删除所有关联表的外键

mysql>alter table table_name drop foreign key constraint_name;

将所有关联表的自增id主键设置uuid为主键

注意:必须保证每张表的自增id的修改均为以下同一语句,否则有可能因为字段类型不一致导致1215错误

mysql>alter table table_name modify id varchar(36) character set utf8mb4 not null default "0";

将已有的id数据更新为去掉"-"符号的uuid数据

mysql>update table_name set id = REPLACE(UUID(),"-","");

Flask相关操作

修改Flask模型中各类属性id以及外键的字段类型

注意:所有关联的主键id及外键都需进行更改

import uuiddef get_uuid():

return uuid.uuid4().hex

class Article(db.Model):

....

id = db.Column(db.String(36), default=get_uuid, primary_key=True)

category_id = db.Column(db.String(36), db.ForeignKey("category.id"))

...

Linux相关操作

进入到Flask项目manage.py文件所在的目录

blogs@master:~$ cd blogs/

进行数据库迁移即可

# 检查模型字段是否修改,如果改变,就产生新的迁移文件

blogs@master:~/blogs$ python manage.py db migrate

# 对迁移文件进行迁移

blogs@master:~/blogs$ python manage.py db upgrade

迁移过程中出现CommandError: Target database is not up to date问题的解决

暴力解决方式(数据可删除时)

删除Flask项目中的migration文件夹

再执行数据库迁移三步曲:

# 初始化迁移文件,系统默认生成migrate文件夹

blogs@master:~/blogs$ python manage.py db init

# 检查模型字段是否修改,如果改变,就产生新的迁移文件

blogs@master:~/blogs$ python manage.py db migrate

# 对迁移文件进行迁移

blogs@master:~/blogs$ python manage.py db upgrade

含蓄解决方式(数据不可删除时)

找到最新创建的版本文件(命名格式:版本号_.py),复制版本号信息

blogs@master:~/blogs$ ls -lah migrations/versions/

切换到MySQL数据库,选择Flask模型所在的数据库

# 进入Flask项目所在的数据库

mysql>use article;

# 查看所有的表

mysql>show tables;

# 找到alembic_version表,然后更新其version_num字段的值为最新版本号

mysql> update alembic_version set version_num ="最新的版本号";

退出数据库,执行数据库迁移命令,即可。

# 检查模型字段是否修改,如果改变,就产生新的迁移文件

blogs@master:~/blogs$ python manage.py db migrate

# 对迁移文件进行迁移

blogs@master:~/blogs$ python manage.py db upgrade

数据回滚

如果发现对数据库的更新不满意,可进行数据回滚,前提是未删除过migration文件夹。

# 获取历史版本号

blogs@master:~/blogs$ python manager.py db history

# 回滚到指定版本

blogs@master:~/blogs$ python manager.py db downgrade

收藏

已收藏取消收藏

登录发表你的评论

0条评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值