Codex CLI 在 Windows 10 下能干一件挺有意思的事:你只需要用自然语言描述需求,它就能自动生成 SQLAlchemy ORM 模型、对应的建表 SQL,甚至直接初始化 SQLite 数据库。整个过程无需手写一条 CREATE TABLE,也不用逐个定义字段类型——那些令人头疼的类型错配、主键遗漏或外键缺失问题,基本可以绕开了。

要实现这个效果,前提条件不多。首先你得确保 codex-cli 版本不低于 2.8.0,然后用自然语言描述把模型文件生成出来,最后通过一个简单的 db_setup.py 脚本执行 create_all(),就能在项目目录下看到 app.db 文件。下面一步步拆开来看。
安装并验证 Codex CLI 环境
打开 PowerShell(注意,不是 CMD),记得以管理员身份运行。直接复制下面这条命令:
pip install codex-cli sqlalchemy[asyncio] sqlite3
装完之后,输入 codex --version 确认一下。如果输出的版本号低于 2.8.0,那就必须升级——低版本不支持 ORM 推断模式,到后面会报 ModuleNotFoundError: No module named 'codex.orm',卡在那里动不了。升级命令也是一样的,加个 --upgrade 就行。
用自然语言描述表结构,生成 ORM 模型文件
在项目根目录下新建一个 models/ 文件夹,然后执行:
codex orm generate --desc "用户表包含ID(主键)、姓名(字符串,最大50)、邮箱(唯一)、注册时间(默认当前时间)、是否激活(布尔,默认True)" --output models/user.py
命令跑完之后,models/user.py 里会自动生成一个完整的类定义:Base 继承、__tablename__、Column 声明,连 func.now() 需要的 import 都会自动带上。不过有一点要注意:如果生成的文件里提示 func 未定义,说明要么是 Codex 版本不对,要么是它漏掉了 from sqlalchemy import func 这一行。遇到这种情况,手动在文件顶部补上即可,不是什么大问题。
生成的代码里,String(50) 和 nullable=False 都会按规范写好,不需要逐行检查。但这里有个容易被忽略的细节:SQLite 本身并不校验字段长度——你在 String(50) 里写 50 还是 500,它都不管。可如果将来要切换到 MySQL 或 PostgreSQL,长度声明就至关重要,否则迁移会直接失败。所以从一开始就把这个习惯养好,别省略。
配置数据库连接并触发建表
新建一个 db_setup.py,内容如下:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models.user import Base
engine = create_engine('sqlite:///app.db', echo=True)
Base.metadata.create_all(engine)
保存之后,在终端里直接 python db_setup.py。控制台会打印出完整的 CREATE TABLE users (...) 语句,同时在当前目录生成 app.db 文件。这一步骤是不可逆的吗?也不全是。需要注意一点:如果 app.db 已经存在,并且表结构不同,create_all() 不会修改已有表,也不会报错——它只会默默跳过。所以首次运行前,最好确认目录里没有同名文件,或者手动删掉旧的 app.db,避免被旧结构困住。
验证表结构是否生成成功
有两种方式可以确认表结构对不对。
方法一:图形界面检查
用 DB Browser for SQLite 打开 app.db → 查看 Tables → 点击 users → 切到 Browse Data 标签页,确认空表可以正常写入数据。
方法二:Python 快速验证
from models.user import User
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
engine = create_engine('sqlite:///app.db')
Session = sessionmaker(bind=engine)
session = Session()
print(session.execute("PRAGMA table_info(users)").all())
如果一切正常,输出应该是一个包含五元组的列表,每个元组对应一个字段:id、name、email、created_at、is_active,并且会显示字段名、类型、是否为空等信息。一旦发现某字段缺失或类型不对,那就意味着自然语言描述有歧义,导致 Codex 推断偏差。解决办法是回到第二步,把描述词改得更精确——比如把“注册时间”改成“注册时间戳(datetime 类型)”,然后再跑一遍。
