CodeIgniter数据填充仅用于开发、测试和部署初期,核心用途是初始化基础数据、准备测试环境、确保多环境数据一致;不可用于生产环境增删改操作。

CodeIgniter数据填充适合做什么
数据填充(Seeder)不是用来上线后日常增删改的,它只在开发、测试、部署初期起作用——核心用途就三个:初始化系统基础数据、准备测试用例所需环境、保证多环境数据库结构一致时内容也对得上。
比如新项目刚跑通迁移(migration),users 表建好了但空着,你总不能每次打开登录页都手动注册 admin;又比如写接口测试时需要 50 条带不同状态的订单数据,靠手点表单太慢;再比如 CI4 部署到测试服务器,DB 是空的,但前端要立刻展示“最近 10 条公告”,这时就得靠填充把 notices 表快速灌几条模拟数据。
哪些场景绝对不该用 Seeder
生产环境自动执行、用户注册流程、后台管理里的“新增”按钮、定时任务写入的数据——这些都不是 Seeder 的活。它没有权限校验、不走业务逻辑、不触发事件钩子,强行塞进线上会绕过所有风控和审计环节。
- Seeder 运行时跳过模型的
insert()方法,直接调用$this->db->insert_batch()或裸 SQL,不会触发模型中的before_insert回调 - 密码字段若用
password_hash()加密,Seeder 里能写,但上线后用户改密必须走控制器+模型完整链路,否则密码策略不一致 - CI3 的
$this->migration->seed()和 CI4 的php spark db:seed都默认关闭事务,出错不会回滚,不适合含强约束(如外键、唯一索引)的复杂填充
CI3 和 CI4 的 Seeder 能力差异很实在
CI3 的 Seeder 是个轻量类,依赖手动创建文件、命名严格(Users_seed.php 对应 Users_seed 类),运行靠命令行或控制器临时调用;CI4 则深度集成进 Spark 工具链,支持命名空间、参数传入(比如 php spark db:seed UserSeeder --limit=100),还能和 Migration 绑定自动执行(php spark migrate:refresh --seed)。
但两者共性更关键:都要求你亲自处理数据格式合规性。比如往 products 表插数据,字段名必须和数组键完全一致:'price' 不能写成 'unit_price',否则字段丢失;含关键字的列(如 'order')在 CI3 中得写成 '`order`',CI4 会自动加反引号但前提是没关 strict mode。
容易被忽略的坑:空值、时区、主键冲突
Seeder 最常翻车的地方不在逻辑,而在细节:
- 时间字段填
date('Y-m-d H:i:s')看似没问题,但如果服务器时区和应用配置不一致(比如 PHPdate_default_timezone_set()没设),插入的created_at可能比当前时间早 8 小时 - 用
$this->db->truncate('table')清空再填充,CI3 不重置自增 ID(ALTER TABLE ... AUTO_INCREMENT = 1得自己补),下次插入可能 ID 从 1000 开始,和预期不符 - CI4 的
insertBatch()在 strict mode 开启时,哪怕一条记录里'status' => ''插进 NOT NULL 字段,整批都会失败且错误提示只说“Data too long for column”,根本看不出是哪条、哪个字段
真正稳的做法,是在填充前先确认数据库连接已禁用 strict mode,并对每条数据做 isset() + !empty() 判空,必要字段缺失时主动跳过或报明确日志,而不是等 MySQL 报错才去翻。


















