OK one more addition to the recipe, please do this:

 DB_SCHEMA = "my_foo_schema"

 with connectable.connect() as connection:
 connection.execute(f'create schema if not exists {DB_SCHEMA}')
 connection.execute(f'set search_path to {DB_SCHEMA}')

 connection.dialect.default_schema_name = DB_SCHEMA


will work completely

alternatively you can use an on connect event on the engine to do the same 
thing.


On Fri, Mar 20, 2020, at 10:48 AM, Brian Hill wrote:
> this is what i tried but it generated the whole schema:
> .
> with connectable.connect() as connection:
> 
> connection.execute(f'create schema if not exists {DB_SCHEMA}')
> connection.execute(f'set search_path to {DB_SCHEMA}')
> 
> context.configure(
> connection=connection,
> target_metadata=metadata,
> )
> 
> with context.begin_transaction():
> context.run_migrations()
> 
> it works when my schema is 'public', when it matches metadata. my solution 
> will be to set my schema to 'public' and use this simple env.py.
> 
> thanks,
> 
> brian
> 
> On Friday, March 20, 2020 at 9:49:52 AM UTC-4, Mike Bayer wrote:
>> I just realized that you really dont need to even use schema_translate_map 
>> at all here. If you use a completely straight env.py, and simply set 
>> search_path=SCHEMA, you should be able to run Alembic in entirely 
>> "schemaless" mode; don't include schemas anywhere nor would you need to set 
>> it for the alembic version table. Postgresql will also CREATE/ ALTER in that 
>> schema as well. As long as your environment runs completely in just one 
>> schema at a time, this can be set up entirely at the connection level.
>> 
>> 
>> On Thu, Mar 19, 2020, at 9:15 PM, Brian Hill wrote:
>>> 
>>> 
>>> On Thursday, March 19, 2020 at 8:20:06 PM UTC-4, Mike Bayer wrote:
>>>> 
>>>> 
>>>> On Thu, Mar 19, 2020, at 7:41 PM, Brian Hill wrote:
>>>>> 
>>>>> 
>>>>> On Thursday, March 19, 2020 at 7:19:08 PM UTC-4, Mike Bayer wrote:
>>>>>> so let me get this straight:
>>>>>> 
>>>>>> 1. you have many schemas
>>>>>> 
>>>>> 
>>>>> yes
>>>>> 
>>>>>> 
>>>>>> 2. you want to run autogenerate only once
>>>>> 
>>>>> yes
>>>>> 
>>>>>> 3. you want your mirations genrated with None for schema
>>>>> 
>>>>> yes
>>>>> 
>>>>>> 4. *HOWEVER*, when you run autogenerate, you are picking *one* (random? 
>>>>>> arbitrary?) schema to use as the target, is that right?
>>>>> 
>>>>> yes one, but it won't be arbitrary, it will be a development schema 
>>>>> generated from the latest version (prior to the change we want to 
>>>>> autogenerate).
>>>>> 
>>>>>> 
>>>>>> 
>>>>>> As it stands, your autogenerate is not going to look in any schema 
>>>>>> except "public", assuming default PG search path, because you did not 
>>>>>> set "include_schemas=True".
>>>>>> 
>>>>> 
>>>>> i had it set to True and it behaves the same. i just took it out based on 
>>>>> your previous suggestion, but again, it behaves the same.
>>>>> 
>>>>>> 
>>>>>> If you truly want autogenerate to look at one schema and only that 
>>>>>> schema, and generate everything as non-schema qualified, then I would 
>>>>>> simply set the default schema in PG to that schema name using 
>>>>>> search_path:
>>>>>> 
>>>>>> connection.execute("SET search_path TO my_schema")
>>>>>> 
>>>>>> that way everything Alembic reflects will be from "my_schema" and it 
>>>>>> will see the schema as blank, and it should generate as such. you might 
>>>>>> need to disable the schema translate map when autogenerate runs but try 
>>>>>> it without doing that first.
>>>>>> 
>>>>> 
>>>>> it's still generating the entire schema in the revision file.
>>>>> 
>>>>> here's the updated section and it behaves the same with/without schema 
>>>>> translate map:
>>>>> 
>>>>> with connectable.connect() as connection:
>>>>> 
>>>>> # create DB_SCHEMA if it doesn't exist
>>>>> connection.execute(f'create schema if not exists {DB_SCHEMA}')
>>>>> 
>>>>> # map metadata schema (None) to DB_SCHEMA
>>>>> # connection = 
>>>>> connection.execution_options(schema_translate_map={None:DB_SCHEMA})
>>>>> 
>>>>> connection.execute(f"set search_path to {DB_SCHEMA}")
>>>>> 
>>>>> # set alembic version table location in DB_SCHEMA
>>>>> context.configure(
>>>>> connection=connection,
>>>>> include_schemas=True,
>>>>> target_metadata=metadata,
>>>>> version_table_schema=DB_SCHEMA,
>>>>> )
>>>>> 
>>>>> with context.begin_transaction():
>>>>> context.run_migrations()
>>>>> 
>>>>> 
>>>> 
>>>> 
>>>> no, don't use "include_schemas". you want to run alembic in a mode where 
>>>> it has no idea there are other schemas to use. i think 
>>>> version_table_schema is OK here but don't use include_schemas. Also turn 
>>>> on INFO or DEBUG logging for the sqlalchemy logger to see exactly what 
>>>> tables it is reflecting.
>>> 
>>> same behavior, entire schema generated. i'll look at using INFO and DEBUG 
>>> tomorrow to get a better idea of what's going on, but using public as my 
>>> dev schema to autogenerate against works. i just have to exclude the 
>>> alembic tables.
>>> 
>>> again thanks for your help in understanding what i was trying to do.
>>> 
>>> brian
>>> 
>>>> 
>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> On Thu, Mar 19, 2020, at 7:09 PM, Brian Hill wrote:
>>>>>>> Here's my env.py. Thanks for the help.
>>>>>>> Brian
>>>>>>> 
>>>>>>> On Thursday, March 19, 2020 at 5:37:38 PM UTC-4, Mike Bayer wrote:
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On Thu, Mar 19, 2020, at 5:30 PM, Brian Hill wrote:
>>>>>>>>> Are there known issues with using autogenerate with multi-tenant 
>>>>>>>>> (schema_translate_map)?
>>>>>>>> 
>>>>>>>> it's complicated and not one-size-fits-all, if you consider that to be 
>>>>>>>> an issue
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> My metadata doesn't have a schema and I my 
>>>>>>>>> schema_translate_map={None:'my_schema'}.
>>>>>>>>> 
>>>>>>>>> This works for migrations but when I use autogenerate the generated 
>>>>>>>>> revision file is the full schema and not the diff.
>>>>>>>>> 
>>>>>>>>> It's detecting the alembic version table in the tenant schema. If I 
>>>>>>>>> run the autogenerate a second time with the new revision file it 
>>>>>>>>> fails saying Taget database is not up to date.
>>>>>>>> 
>>>>>>>> are you setting include_schemas=True in your environment? I'd probably 
>>>>>>>> not do this. Can't help much more without a complete and concise 
>>>>>>>> working example of your env.py, please remove all extraneous details.
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> Thanks,
>>>>>>>>> 
>>>>>>>>> Brian
>>>>>>>>> 

>>>>>>>>> --
>>>>>>>>> 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.
>>>>>>>>> To view this discussion on the web visit 
>>>>>>>>> https://groups.google.com/d/msgid/sqlalchemy-alembic/5011240c-ba09-4423-9a05-0e6d2481dadf%40googlegroups.com
>>>>>>>>>  
>>>>>>>>> <https://groups.google.com/d/msgid/sqlalchemy-alembic/5011240c-ba09-4423-9a05-0e6d2481dadf%40googlegroups.com?utm_medium=email&utm_source=footer>.
>>>>>>>> 
>>>>>>> 

>>>>>>> --
>>>>>>> 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.
>>>>>>> To view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/sqlalchemy-alembic/fe6fddb4-25d6-4dd1-be3a-c1a174548bb4%40googlegroups.com
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/sqlalchemy-alembic/fe6fddb4-25d6-4dd1-be3a-c1a174548bb4%40googlegroups.com?utm_medium=email&utm_source=footer>.
>>>>>>> 
>>>>>>> 
>>>>>>> *Attachments:*
>>>>>>>  * env.py
>>>>>> 
>>>>> 

>>>>> --
>>>>> 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.
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/sqlalchemy-alembic/f6dcb50d-368c-4f8d-8e0b-af6f80d10084%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/sqlalchemy-alembic/f6dcb50d-368c-4f8d-8e0b-af6f80d10084%40googlegroups.com?utm_medium=email&utm_source=footer>.
>>>> 
>>> 

>>> --
>>> 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.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/sqlalchemy-alembic/ef68d038-2452-4b29-960d-923df0ae844b%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/sqlalchemy-alembic/ef68d038-2452-4b29-960d-923df0ae844b%40googlegroups.com?utm_medium=email&utm_source=footer>.
>> 
> 

> --
>  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.
>  To view this discussion on the web visit 
> https://groups.google.com/d/msgid/sqlalchemy-alembic/894af588-f022-4a96-9cfb-a5152b819af4%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/sqlalchemy-alembic/894af588-f022-4a96-9cfb-a5152b819af4%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy-alembic/ef09cf54-9b7a-4fba-b4fd-c7f65dad1ed0%40www.fastmail.com.

Reply via email to