业务中有一个接口,逻辑是根据传入的参数在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!