Ruby on Rails Migration - Create New Database Schema

12,754

Well that depends what your migration looks like, what your database.yml looks like and what exactly you are trying to attempt. Anyway more information is needed change the names if you have to and post an example database.yml and the migration. does the migration change the search_path for the adapter for example ?

But know that in general rails and postgresql schemas don't work well together (yet?).

There are a few places which have problems. Try and build and app that uses only one pg database with 2 non-default schemas one for dev and one for test and tell me about it. (from thefollowing I can already tell you that you will get burned)

Maybe it was fixed since the last time I played with it but when I see http://rails.lighthouseapp.com/projects/8994/tickets/390-postgres-adapter-quotes-table-name-breaks-when-non-default-schema-is-used or this http://rails.lighthouseapp.com/projects/8994/tickets/918-postgresql-tables-not-generating-correct-schema-list or this in postgresql_adapter.rb

  # Drops a PostgreSQL database
  #
  # Example:
  #   drop_database 'matt_development'
  def drop_database(name) #:nodoc:
    execute "DROP DATABASE IF EXISTS #{name}"
  end

(yes this is wrong if you use the same database with different schemas for both dev and test, this would drop both databases each time you run the unit tests !)

I actually started writing patches. the first one was for the indexes methods in the adapter which didn't care about the search_path ending up with duplicated indexes in some conditions, then I started getting hurt by the rest and ended up abandonning the idea of using schemas: I wanted to get my app done and I didn't have the extra time needed to fix the problems I had using schemas.

Share:
12,754
Chris Knight
Author by

Chris Knight

Keen Agilist specialising in C# and MVC

Updated on June 04, 2022

Comments

  • Chris Knight
    Chris Knight almost 2 years

    I have a migration that runs an SQL script to create a new Postgres schema. When creating a new database in Postgres by default it creates a schema called 'public', which is the main schema we use. The migration to create the new database schema seems to be working fine, however the problem occurs after the migration has run, when rails tries to update the 'schema_info' table that it relies on it says that it does not exist, as if it is looking for it in the new database schema and not the default 'public' schema where the table actually is.

    Does anybody know how I can tell rails to look at the 'public' schema for this table?

    Example of SQL being executed: ~

    CREATE SCHEMA new_schema;
    COMMENT ON SCHEMA new_schema IS 'this is the new Postgres database schema to sit along side the "public" schema';
    -- various tables, triggers and functions created in new_schema
    

    Error being thrown: ~

    RuntimeError: ERROR C42P01  Mrelation "schema_info" does not exist
    L221    RRangeVarGetRelid: UPDATE schema_info SET version = ??
    

    Thanks for your help

    Chris Knight

  • Chris Knight
    Chris Knight over 15 years
    Thanks for that, it was the search_path had been changed but not reset to public