记录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!

我在和同学参加一个导师的项目,我们小组的板块是智慧仓储,我们负责货物从入库区到货架,从货架到集货单元的板块,其他部分是其他小组完成的,但是我们后面会需要合在一起,也就是我们弄的东西要有连接性,我负责的是后端和可视化,我们有一个入库区,20个货架,6个集货单元(集货1、集货2、集货3、集货4、集货5、集货6)和一个充维区,我们需要机器人完成入库(也就是从入库区取货到对应的目标货架上)和出库(机器人收到任务分配后去目标货架取货物),然后因为路径规划和任务分配是其他同学负责,然后货架和货物要编号(这个我可以先弄我的便于跑通我的程序,但是后期要可以扫描或者读取其他组员的表格数据来修改,也就是要可以修改的),如A-01-05-03代表A01货架,第5列第3行,我负责的是后端和可视化,我们各个人都有自己负责的板块,但是我们需要公用同样的数据库,以数据库的“表”为枢纽,机器人从表中读数据所需数据,并反馈数据存入表中,任务分配算法从表中读取机器人目前状态进行计算,并将规划结果存入表中,后端服务器也是从表中读取数据进行可视化,并协调机器人端和算法端将各自生成的数据写入表中,我是中间的枢纽,我的组员负责任务分配的和路径规划的,选择A*算法和遗传算法,任务分配目前先结合学长的matlab代码(需要的话我可以补充,可以提醒我补充),她会用matlab模拟出机器人在地图上的情况,我这边要负责衔接和可视化,我们需要建立几个重要的表(但是目前我不清楚一共需要哪些表),我因为各个计算机语言掌握的不是很好,无法亲手写出那么多代码,所以很多很多方面需要借助ai人工智能,我需要知道如何能够有效的与ai沟通(我不知道怎么借助工具来辅助我完成这个项目,因为如果我从头开始一点点的学习所有语言肯定是不可能的),我之前结合ai帮我,在PyCharm里面弄了一个,但是有很多问题,第一,没有迭代,而是想到什么功能就添加上去,其实最基本的几个数据库表的连接都没有,也没几个明确的数据库,根本没有将最基本的枢纽作用发挥出来,就开始很多复杂的功能,并且后面各个端口都连接不起来,所以我需要更多更高效有用可靠的方法去询问ai让ai辅助我,结合之前的经验,我们需要将最基本的功能实现,弄扎实,清楚端口数据库之间正确的连接,清楚怎么使用ai帮助我(我的方案我负责的还有很多地方可以帮我补充)
最新发布
11-07
Docker Compose 项目中,如果修改了 `.env` 文件中的配置变量,这些更改不会自动应用到已经运行的服务容器中。为了使新的环境变量生效,需要重启相关的服务容器。由于 `.env` 文件只是用于为服务提供默认环境变量,而 `docker-compose.yml` 中的 `environment` 配置具有更高的优先级,因此确保在重启时没有在 `docker-compose.yml` 中硬编码旧的环境变量[^1]。 ### 修改 `.env` 文件后重启容器的步骤 1. **停止服务容器** 使用以下命令停止正在运行的服务容器: ```bash docker-compose down ``` 该命令会停止并删除容器,但不会删除镜像或持久化数据卷。 2. **重新构建服务(如有必要)** 如果服务的启动依赖于某些构建时的环境变量,或者你希望确保新的配置被正确加载,可以重新构建服务镜像: ```bash docker-compose build ``` 3. **启动服务容器** 使用以下命令重新创建并启动服务容器: ```bash docker-compose up -d ``` 参数 `-d` 表示以分离模式(后台运行)启动容器。 4. **验证更改是否生效** 可以通过查看容器的环境变量来确认新的配置是否已被正确加载: ```bash docker-compose exec <service_name> printenv ``` 替换 `<service_name>` 为你的服务名称,该命令会显示容器中所有的环境变量。 ### 注意事项 - 如果你使用了 `environment` 在 `docker-compose.yml` 中显式设置了某些变量,`.env` 文件中的同名变量将不会生效[^1]。 - 如果希望只重启某个特定服务而不是整个项目,可以使用: ```bash docker-compose restart <service_name> ``` 但需要注意的是,这种方式不会重新加载 `.env` 文件中的新值,除非容器被重新创建。 - 在某些情况下,可能需要使用 `--no-cache` 选项重新构建镜像,以确保所有配置都基于最新的 `.env` 文件内容。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值