On 04/11/2016 12:34 PM, Zack S wrote:
(X-Post from Stackoverflow: http://stackoverflow.com/q/36511941/703040)


I'm writing some custom code for Alembic to keep my database always
updated in my dev environment for a project. The project involves a
database with the following:

  * A |public| schema for shared data
  * A single schema per client "database"
  * One schema that acts as a |prototype| for all of the client schemas
    (orgs)

At this moment, I'm not worried about the multiple client schemas, only
keeping the |public| and |prototype| schemas up-to-date. My env.py
script works great for the |public| schema, but not |prototype| because
alembic is trying to use the version table from |public| when working
with |prototype|.

So, I thought I could use the |version_table_schema|
<http://alembic.readthedocs.org/en/latest/api/runtime.html?highlight=version_table_schema#alembic.runtime.environment.EnvironmentContext.configure.params.version_table_schema>
 option
to maintain one version table in the |public| schema and one in the
|prototype| schema. However, as soon as I start using that, I get a
'/relation "public.alembic_version" does not exist/' error when I
attempt to do the upgrade.

The only difference that I see is that, when I use
|version_table_schema| set to the appropriate schema, the generated
revision scripts actually contain a line to
|op.drop_table('alembic_version')|. The line ONLY exists when
|version_table_schema| is in use.

I'm hoping that I'm just missing something minor.


you're likely hitting the very confusing schema rules that apply to Postgresql. See http://docs.sqlalchemy.org/en/rel_1_0/dialects/postgresql.html#remote-schema-table-introspection-and-postgresql-search-path for details. Short answer is that schema of "blank" and schema of "public" are two different things on the Python side, leading to a lot of confusion.

In order to convince autogenerate to not affect alembic_version at all no matter where it pops up, you probably need to create an exclusion rule using include_object: http://alembic.readthedocs.org/en/latest/api/runtime.html?highlight=include_object#alembic.runtime.environment.EnvironmentContext.configure.params.include_object

def include_object(object, name, type_, reflected, compare_to):
    if (type_ == "table" and name == 'alembic_version'):
         return False
    else:
        return True





I've posted the source files on SO already
<http://stackoverflow.com/q/36511941/703040> if they are helpful.


Thanks!

--
You received this message because you are subscribed to the Google
Groups "sqlalchemy-alembic" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to sqlalchemy-alembic+unsubscr...@googlegroups.com
<mailto:sqlalchemy-alembic+unsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups 
"sqlalchemy-alembic" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy-alembic+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to