Symfony3.4+PostGIS:升级PostgreSQL后Doctrine创建Schema报错
解决PostgreSQL 10 + PostGIS 2.4下Doctrine创建Schema时「min_value不存在」的错误
嘿,这个问题我太熟悉了——之前帮好几个开发者排查过类似的PostgreSQL升级后Doctrine报错的情况。咱们先搞清楚根因:
核心问题出在PostgreSQL 10对序列存储结构的重大变更:在9.6及更早版本里,序列是带min_value、increment_by这些字段的独立表;但从10开始,这些元数据被移到了系统表pg_sequence里,原来的序列表不再直接包含这些列。而你用的Doctrine版本(大概率是DBAL 2.7以下的旧版本)还在沿用老的查询逻辑,直接从序列表读这些字段,自然就触发了Undefined column: 7 ERROR: column "min_value" does not exist的错误。
下面给你几个可行的解决方案,按推荐程度排序:
最省心的方案:升级Doctrine DBAL
Doctrine DBAL从2.7.0版本开始就完全适配了PostgreSQL 10的序列结构,升级后直接解决问题:
- 如果用Composer管理依赖,直接跑这条命令:
composer require doctrine/dbal:^2.7 - 升级完成后,清一下Doctrine的缓存,再重新执行Schema创建命令,错误应该就消失了。
临时救急方案(不想升级Doctrine的情况)
要是暂时没法升级依赖,可以手动修改Doctrine的PostgreSQL驱动来适配新的查询逻辑:
- 找到
PostgreSQLPlatform.php文件(一般在vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/目录下) - 定位到获取序列信息的方法(比如
getSequenceMetadataSQL),把原来的查询语句:
替换成PostgreSQL 10兼容的写法:SELECT min_value, increment_by FROM "meas_id_seq"SELECT s.min_value, s.increment_by FROM pg_sequence s JOIN pg_class c ON s.seqrelid = c.oid WHERE c.relname = 'meas_id_seq' - 保存修改后清除Doctrine的缓存,再试一次Schema命令。
额外提醒
- 升级PostgreSQL和PostGIS后,别忘了执行
ALTER EXTENSION postgis UPDATE;,确保PostGIS扩展也完成升级,避免其他潜在的兼容问题。 - 如果你的项目用了Doctrine ORM,建议同步升级ORM到
2.6及以上版本,和DBAL版本保持兼容,避免出现其他奇怪的问题。
内容的提问来源于stack exchange,提问作者Salim Ben Aissa
相关产品推荐
相关产品推荐

