Symfony 6.1平台环境GeneratedValue不生成ID问题排查修复
排查与修复步骤
一、先核对实体ID的映射配置
- 打开Company实体类,检查ID字段的Doctrine注解,必须用PostgreSQL兼容的自增策略:
要么用IDENTITY(自动对应序列):
要么明确指定序列(适合需要自定义序列名的场景):/** * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") * @ORM\Column(type="integer") */ private ?int $id = null;
注解写错的话,Doctrine根本不知道该怎么生成ID,这是最常见的坑。/** * @ORM\Id * @ORM\GeneratedValue(strategy="SEQUENCE") * @ORM\SequenceGenerator(sequenceName="company_id_seq", allocationSize=1, initialValue=1) * @ORM\Column(type="integer") */ private ?int $id = null;
二、检查迁移文件的完整性
- 本地生成的迁移文件可能漏了序列创建语句,导致Platform.sh执行迁移时没给company表加自增序列。
- 先对比本地和生产环境的迁移历史:两边都执行
doctrine:migrations:list,确认所有迁移脚本都在生产环境执行过。 - 要是确实缺了序列相关的迁移,手动补一个迁移文件:
然后在生产环境执行public function up(Schema $schema): void { // 创建序列并设置ID列默认值 $this->addSql('CREATE SEQUENCE company_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); $this->addSql('ALTER TABLE company ALTER COLUMN id SET DEFAULT nextval(\'company_id_seq\')'); } public function down(Schema $schema): void { $this->addSql('DROP SEQUENCE company_id_seq CASCADE'); $this->addSql('ALTER TABLE company ALTER COLUMN id DROP DEFAULT'); }doctrine:migrations:execute --up <迁移文件编号>应用这个变更。
三、验证生产环境的数据库权限
- 虽然Platform.sh默认给的数据库权限足够,但偶尔会有自定义配置出问题,去平台控制台看看数据库用户有没有创建序列、修改表结构的权限。
四、清掉Doctrine的缓存
- 本地和生产环境都清一遍缓存:
- 本地:
php bin/console cache:clear和php bin/console doctrine:cache:clear-metadata - 生产环境:要么通过平台控制台执行这俩命令,要么确保部署脚本里自动做了缓存清理。
缓存过期或者元数据不一致也会导致Doctrine识别不了序列。
- 本地:
五、检查Platform.sh的部署钩子
- 打开
.platform.app.yaml,看看deploy钩子有没有正确执行迁移命令,比如:
要是迁移命令没写对或者被跳过了,表结构自然同步不完整。hooks: deploy: | set -e php bin/console doctrine:migrations:migrate --no-interaction
六、临时应急:手动补序列
要是上面的步骤都没解决,直接在生产环境数据库里手动执行SQL:
CREATE SEQUENCE company_id_seq INCREMENT BY 1 MINVALUE 1 START 1; ALTER TABLE company ALTER COLUMN id SET DEFAULT nextval('company_id_seq');
之后一定要把这个变更做成迁移文件,不然下次部署又会出问题。
内容的提问来源于stack exchange,提问作者Roman Reimche
相关产品推荐
相关产品推荐

