必须通过物理落库验证Codex读写逻辑是否生效,而非仅依赖接口返回成功;需配置独立test库、显式事务测试、跨连接查询及主从延迟排查。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要验证Codex生成的数据库读写逻辑是否真正生效,而不是只看接口返回成功就认为数据已落库——因为主从延迟、事务未提交、连接池复用或读写分离配置都可能导致“写完查不到”。
确认测试环境使用独立数据库实例
进入项目根目录,检查是否存在.env.local文件;若不存在,立即创建并写入以下内容:
DATABASE_URL=jdbc:mysql://localhost:3306/codex_test?useSSL=false&serverTimezone=Asia/Shanghai
DATABASE_USERNAME=codex_tester
DATABASE_PASSWORD=StrongPass_2026!
这一步的关键是数据库名必须为codex_test,且账号密码与建库时分配的完全一致。【Codex CLI 默认只读取项目根目录下的.env.local,不是 .env,也不是 application.yml】。如果路径错误,它会静默 fallback 到开发库配置,而你完全不会收到警告。
执行 codex --env local db ping 验证连接。输出显示 “Connected to codex_test” 才算通过。
构造可验证的写入-查询闭环
方法一:用 Codex 生成带显式事务控制的测试用例
在终端运行:
codex test generate --framework junit5 --target src/test/java/com/example/dao/UserDaoTest.java src/main/java/com/example/dao/UserDao.java
生成后打开 UserDaoTest.java,找到 testInsertThenSelect() 方法,确认其中包含:① @Transactional 注解;② insert 后立即调用 selectById;③ assertNotNull(result) 断言。
方法二:手动插入并跨连接验证(绕过事务缓存)
第一步:用 Codex 生成一条 INSERT SQL:
codex sql insert into user (id, name, created_at) values (99999, 'test_codex_rw', now())
第二步:新开一个 MySQL 客户端连接(不复用当前应用连接池),执行:
SELECT * FROM user WHERE id = 99999;
通过本地 MCP 桥接程序将 QQ 邮箱接入 Codex,配置所需的.env凭证信息、注册 MCP 服务端,并完成收件箱读取与邮件发送的全流程测试。适用场景:用户需要将 QQ 邮箱连接至 Codex、让 Codex 读取 / 发送 QQ 邮件、安装 / 修复qq_mail MCP 服务端,或是在 Windows 系统上排查 IMAP/SMTP 配置故障时,执行以上操作。
这一步能真实判断数据是否已物理落盘。如果这里查不到,说明写入根本没成功,或被事务回滚了。
排查主从延迟导致的“写后读空”
第一步:确认当前查询走的是主库还是从库
在应用日志中搜索关键词 “jdbc:mysql://”,观察 SELECT 语句实际连接的 host 是否与 DATABASE_URL 中的一致。若不一致,说明读写分离中间件(如 ShardingSphere、MyCat)正在将 SELECT 路由到从库。
第二步:强制走主库查一次
在测试代码中临时添加注解 @DS("master")(适配你的数据源路由框架),或直接在 DAO 层调用 DataSourceUtils.getConnection(dataSourceMaster) 获取主库连接执行 SELECT。
第三步:比对主从同步延迟值
登录主库执行:
SHOW MASTER STATUS;
登录从库执行:
SHOW SLAVE STATUS\G
查看 Seconds_Behind_Master 字段。若大于 0,说明从库落后;此时“写后立刻读从库”失败是正常现象,不是 Codex 逻辑问题。
这一步操作起来很简单,但必须做——本地开发环境从来不复现,上线后偶发的问题,八成出在这里。
用 Codex 自动化校验读写一致性
在项目根目录下新建 tests/consistency/ReadWriteCheck.java,粘贴以下内容:
import static org.junit.jupiter.api.Assertions.*;
public class ReadWriteCheck {
@Test
void shouldWriteAndReadSameValue() {
Long id = System.currentTimeMillis();
userDao.insert(new User(id, "rw_check")); // 写入
User read = userDao.selectById(id); // 立即读
assertNotNull(read);
assertEquals("rw_check", read.getName());
}}
运行:
mvn test -Dtest=ReadWriteCheck
若测试失败,不要先改代码——先检查 UserDao 的 selectById 方法是否加了 @DS("slave") 或类似路由注解。【这是真实踩过的坑:一个注解导致所有单元测试读的都是延迟从库】。










