title: How to use two databases: Postgres and Snowflake with alembic and sqlachemy?
body: <p>I want to use  two databases: <strong>Postgres</strong> and <strong>Snowflake</strong> using <strong>alembic</strong> migration tool in a single <strong>fastapi</strong> app.</p>
  <p>Able to perform alembic migrations and alembic upgrade if using single database i.e. Postgres but on using multiple databases alembic is creating problems.</p>
  <p>Tried using snowflake database independently on a different app with only snowflake as a database. It is working perfectly fine with revisions and alembic upgrade but not working on a single app with two databases.</p>
  <p>Here is my directory structure as suggested in few articles:</p>
  <pre><code>main-project--&gt;
      postgres-migration--&gt;
              versions/
              env.py
              README
              script.py.mako
      snowflake-migration--&gt;
              versions/
              env.py
              README
              script.py.mako
  </code></pre>
  <p>Here is my alembic.ini file generated for postgres, but I manipulated it to support snowflake:</p>
  <pre><code># A generic, single database configuration.
  
  [alembic]
  # path to migration scripts
  script_location = db-migration
  
  [A_SNOWFLAKE_SCHEMA]
  # path to env.py and migration scripts for schema1
  script_location = snowflake-db-migration
  
  # template used to generate migration files
  # file_template = %%(rev)s_%%(slug)s
  
  # sys.path path, will be prepended to sys.path if present.
  # defaults to the current working directory.
  prepend_sys_path = .
  
  # timezone to use when rendering the date
  # within the migration file as well as the filename.
  # string value is passed to dateutil.tz.gettz()
  # leave blank for localtime
  # timezone =
  
  # max length of characters to apply to the
  # &quot;slug&quot; field
  # truncate_slug_length = 40
  
  # set to 'true' to run the environment during
  # the 'revision' command, regardless of autogenerate
  # revision_environment = false
  
  # set to 'true' to allow .pyc and .pyo files without
  # a source .py file to be detected as revisions in the
  # versions/ directory
  # sourceless = false
  
  # version location specification; this defaults
  # to db-migration/versions.  When using multiple version
  # directories, initial revisions must be specified with --version-path
  # version_locations = %(here)s/bar %(here)s/bat db-migration/versions
  
  # the output encoding used when revision files
  # are written from script.py.mako
  # output_encoding = utf-8
  
  #sqlalchemy.url = driver://user:pass@localhost/dbname
  
  
  [post_write_hooks]
  # post_write_hooks defines scripts or Python functions that are run
  # on newly generated revision scripts.  See the documentation for further
  # detail and examples
  
  # format using &quot;black&quot; - use the console_scripts runner, against the &quot;black&quot; entrypoint
  # hooks = black
  # black.type = console_scripts
  # black.entrypoint = black
  # black.options = -l 79 REVISION_SCRIPT_FILENAME
  
  # Logging configuration
  [loggers]
  keys = root,sqlalchemy,alembic
  
  [handlers]
  keys = console
  
  [formatters]
  keys = generic
  
  [logger_root]
  level = WARN
  handlers = console
  qualname =
  
  [logger_sqlalchemy]
  level = WARN
  handlers =
  qualname = sqlalchemy.engine
  
  [logger_alembic]
  level = INFO
  handlers =
  qualname = alembic
  
  [handler_console]
  class = StreamHandler
  args = (sys.stderr,)
  level = NOTSET
  formatter = generic
  
  [formatter_generic]
  format = %(levelname)-5.5s [%(name)s] %(message)s
  datefmt = %H:%M:%S
  </code></pre>
  <p>Above file is able to create revision scripts inside versions/ folder of snowflake-db-migration. But not able to run the generated revision using(throwing errors):</p>
  <pre><code>alembic upgrade head
  </code></pre>
  <p>How to convert this .ini file to support multi-database .ini file?
  Tried using command:</p>
  <pre><code>alembic init --template multidb snowflake-db-migration
  </code></pre>
  <p>But not sure how to integrate changes here.
  Also don't want to hardcode <strong>sqlalchemy.url</strong> variable in .ini file as required to use snowflake variables from a .toml file which contains all environment variables.</p>
  <p>There are few answers but none of them are accepted and exactly similar to my use case.</p>