多表外键下将普通的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条评论

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

  1. mysql建表 外键_mysql建表外键怎么设

    mysql建表外键怎么设 mysql建表时设置外键的方法:在"CREATE TABLE"语句中,通过"[CONSTRAINT ] FOREIGN KEY 字段名 [,字段 ...

  2. mysql建表外键_mysql建表外键怎么设?

    mysql建表时设置外键的方法:在"CREATE TABLE"语句中,通过"[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,-] REFEREN ...

  3. MySQL笔记:第06章_多表查询

    第06章_多表查询 多表查询概述 1.一个案例引发的多表连接 1.1 案例说明 1.2 笛卡尔积(或交叉连接)的理解 演示代码 2. 多表查询分类讲解 分类1:等值连接 vs 非等值连接 等值连接 非 ...

  4. sql删除主键_产品经理的第一节SQL课——ID到底是干什么的?!

    来这里找志同道合的小伙伴! "头脑风暴" 同大家一起学SQL之前,先简单头脑风暴一个问题:一个企业里有1000个员工,假如这1000个员工中有300个全叫张伟,如何进行区别管理呢? ...

  5. 使用阿里云Mysql集群做读写分离_以及使用阿里云服务器自己搭建MyCat集群_费用核算---Linux工作笔记046

    咨询了一下阿里云,如果买阿里云的MySQL服务器的话,一台是5500一年,4GHz频率的CPU, 50G的硬盘,如果你也跟我一样,一个单表的数据就达到了20GB的话,那么,只买一台阿里的MySql 服 ...

  6. mysql 联结主键_联结表中的复合主键 - Sequelize

    使用Sequelize和MySQL数据库,我试图在联结表中实现复合主键组合,但遗憾的是没有结果 . 我有 table : 它们与许多人有很多关系 . 在联结表user_has_project中,我想要 ...

  7. mysql支持事务的储存引擎_「mysql事务与mysql储存引擎」- 海风纷飞Blog

    事务概念及存储引擎 1.0 为何要事务? 先来看一个场景,银行转账汇款: 李彦宏和周鸿祎天天打架,现在让李彦宏给周鸿祎转款1000 元 设计如下表 account表 编号(id)用户名(user)金额 ...

  8. win7插了耳机还是外放_地铁禁止外放10天后,我的耳朵还是阵亡了

    酷玩实验室作品首发于微信号 酷玩实验室微信ID:coollabs 乡亲们呐,我是快爷. 最近大家有没有一个感觉:自己这两个月什么也没干, 光用来见证历史了. 然而,就在我以为自己见识过了足够的世面,已 ...

  9. mysql环境搭载后老出错_使用Docker在window10下搭建SWOFT开发环境,mysql连接错误

    使用Docker在window10下搭建SWOFT开发环境,mysql连接错误 { "code": 0, "error": "(Swoft\\Db\\ ...

最新文章

  1. DCNv2 windows编译 2021ok
  2. html百度地图标记图标,百度地图开发之点击地图给该位置添加标注(图标)并弹出对应的位置...
  3. linux打开sqlite3数据库,Centos6.5中如何用sqlite3命令打开’.db’后缀的数据库执行sql...
  4. windows系统SSH证书设置
  5. MongoDB启动失败: 此应用无法在你的电脑上运行
  6. python--简易员工信息系统编写
  7. ps色板文件怎么导入?
  8. CMSIS-RTOS
  9. new_picview_PicView图片浏览器
  10. python爬虫——爬取taptap游戏的评论信息(通过fiddler抓包)
  11. Node.js Websocket 井字棋游戏
  12. 手机免费使用PDF编辑器一键支持PDF转Word,随时随地处理文档
  13. redisson + CacheManager缓存管理
  14. adb脚本选择语句_常用adb命令汇总(绝对干货)
  15. PHP 阿里云视频点播HLS加密(简单流程)
  16. 新人该如何学习做产品经理
  17. 期刊论文发表引用部分会算重复率吗
  18. 基于北斗GPS模块,利用ESP32 S3蓝牙通讯的GPS系统
  19. ITEXT-定位PDF中图片的坐标与页码
  20. 接口设计,这36个核心知识点一定要注意

热门文章

  1. Storm 01之 Storm基本概念及第一个demo
  2. AM消息中间件OA、ERP消息提醒的必要工具
  3. 机会是怎么变成陷阱的?
  4. c语言 swap交换函数_C语言经典100题(14)
  5. oracle ddl会被什么阻塞,MySQL Online DDL与DML并发阻塞关系总结
  6. linux备份一个脚本,发个备份脚本 - Linux系统与应用 - LinuxApp - 水木社区
  7. java自己实现读写锁_关于读写锁算法的Java实现及思考
  8. linux 日志 停止滚动,linux – syslog在日志轮换后停止记录
  9. linux mysql 1045 错误_Linux 下,mysql数据库报无法登陆错误:ERROR 1045 (28000): Access denied for use...
  10. 从网上下载的jar包导入到本地maven库