如何移除Rails PostgreSQL structure.sql中的Schema名称避免冲突?
这个问题其实是PostgreSQL的pg_dump工具与Rails的pg gem交互时的格式差异导致的——不同版本的pg_dump生成结构文件的默认行为会有区别,你遇到的就是它自动给表名加上了public.前缀的情况。下面是几个靠谱的解决办法:
方法1:配置pg_dump的参数(推荐)
Rails允许我们在database.yml里指定schema_dump_flags来控制pg_dump的行为,只需要添加--no-schema-qualifiers参数,就能让生成的SQL语句不带Schema前缀。
打开你的config/database.yml,在对应的环境配置(比如development、production)里加上这一行:
development: adapter: postgresql database: your_app_development username: your_username password: your_password host: localhost # 新增下面这行 schema_dump_flags: --no-schema-qualifiers
保存后重新执行rake db:structure:dump,生成的structure.sql里就会回到原来的格式:先设置search_path,然后直接CREATE TABLE account_roles (...),不会再出现public.前缀了。
方法2:确保search_path配置正确
检查你的structure.sql开头是否存在这条语句:
SET search_path = public, pg_catalog;
这条语句会让PostgreSQL默认使用public schema,即使表名没有前缀也能正确识别。如果这条语句丢失了,也可能导致pg_dump自动添加前缀,所以确保它存在也很重要。
方法3:手动清理(不推荐)
如果只是临时需要,你可以手动替换structure.sql里的所有public.前缀,但这种方法治标不治本——每次执行db:structure:dump都会重新生成带前缀的语句,所以还是优先用方法1来解决。
需要注意的是,--no-schema-qualifiers参数在PostgreSQL 9.6版本(你的psql是9.6.8)是完全支持的,不用担心兼容性问题。
内容的提问来源于stack exchange,提问作者Lex

