记录docker容器内使用sqlalchemy的connection.execute修改语句后不生效的问题

业务中有一个接口,逻辑是根据传入的参数在MySQL中建立相应名称的表,代码类似以下

def createTable():
    if not (factor_table,) in connection.execute(text(f'SHOW TABLES FROM 这是库名')).fetchall():
        connection.execute(text(f'''
            CREATE TABLE IF NOT EXISTS 这是库名.{factor_table} (
                `ticker` varchar(40) COLLATE utf8mb3_bin DEFAULT NULL COMMENT '代码',
                `TradingDay` varchar(8) COLLATE utf8mb3_bin DEFAULT NULL COMMENT '交易日期',
                `{factor_table}` decimal(20,4) DEFAULT NULL COMMENT '因子值',
                `CreateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
                UNIQUE 
                    KEY `{factor_table}_pk` (`ticker`,`TradingDay`),
                    KEY `{factor_table}_CreateTime_index` (`CreateTime`),
                    KEY `{factor_table}_TradingDay_index` (`TradingDay`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin
        '''))
        return Reponse.success('创建成功')
    else:
        return Reponse.error('已存在')
    

昨天晚上同事反馈希望把`{factor_table}`这个字段的数据类型从decimal(20,4)修改为decimal(20,8),遂一早过来修改。

就是修改一个字段的事,改之,提交git,手动去docker容器里修改,重启容器,一气呵成。

然而测试一下,神奇的事情发生了:

我去,怎么还是decimal(20,4)???

于是进入容器,使用cat命令查看接口代码,确实已经修改了,又重启容器,重启mysql,都不生效。

看起来这是一个缓存问题,因为容器重启过了,所以应该不是sqlalchemy的缓存,而是MySQL自己的,但是CREATE语句也有缓存吗,我不得其解。

于是尝试尽可能地修改这个语句,使缓存失效,于是把SQL语句中的COMMENT全部乱改,重启容器:

CREATE TABLE IF NOT EXISTS 这是库名.{factor_table} (
    `ticker` varchar(40) COLLATE utf8mb3_bin DEFAULT NULL COMMENT '不是代码',
    `TradingDay` varchar(8) COLLATE utf8mb3_bin DEFAULT NULL COMMENT '并非交易日期',
    `{factor_table}` decimal(20,4) DEFAULT NULL COMMENT '可能是因子值',
    `CreateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP,

再次测试接口,查看数据库表:

好吧,这次成功变成了decimal(20,8),收工

然而到底是为什么呢?我仍然不知道。可能以后还会碰到,也可能不会碰到了。

哈!神奇的缓存!

嘿!神奇的MySQL!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值