Re: autogenerate revision fails in a multi-db project generated with: `alembic init --template multidb alembic`

2018-08-13 Thread René-paul Debroize
Hello

Thank you for your answer.

The problem was that the entry db_name was missing from the alembic.ini
file. It is not how I configure the engine. However add something like:

config.set_main_option("databases", db_names)


rather than just fill the db_name var in the env.py file fixed the problem.

Thanks again!





2018-08-10 17:16 GMT+02:00 Mike Bayer :

> On Fri, Aug 10, 2018 at 6:47 AM,   wrote:
> > Hello
> >
> > I'm trying to use alembic to generate a migration file in a multi-db
> > environment. I first created the project using `alembic init --template
> > multidb alembic`
> > and then hack the `env.py` script (didn't touch to
> `run_migration_online`)
> > to suit my needs.
> >
> > Here is the error I got after invoking `alembic --raiseerr revision
> > --autogenerate -m 'First revision`:
>
> have you also received the alembic.ini from that run, or was there a
> previous alembic.ini present that prevented the new one from being
> genreated?   the alembic.ini for multidb requires a "databases"
> configuration:
>
> databases = engine1, engine2
>
> [engine1]
> sqlalchemy.url = driver://user:pass@localhost/dbname
>
> [engine2]
> sqlalchemy.url = driver://user:pass@localhost/dbname2
>
>
> I can reproduce your error if that section is missing.   Restore it,
> and also put valid URLs in there, and then it works.If this is not
> how you are configuring, then you need to alter the env.py to locate
> your database URLs somehow.
>
>
>
>
>
> >
> > [...]
> > Generating
> > /home/rdebroiz/Quantivly/services/alembic/versions/
> 201808-10-T12-30-48-first_revision-cb8c6da27574.py
> > ... FAILED
> > Traceback (most recent call last):
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/alembic/util/pyfiles.py",
> > line 15, in template_to_file
> > output = template.render_unicode(**kw).encode(output_encoding)
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/mako/template.py",
> > line 471, in render_unicode
> > as_unicode=True)
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/mako/runtime.py",
> > line 838, in _render
> > **_kwargs_for_callable(callable_, data))
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/mako/runtime.py",
> > line 873, in _render_context
> > _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/mako/runtime.py",
> > line 899, in _exec_template
> > callable_(context, *args, **kwargs)
> > File "alembic_script_py_mako", line 62, in render_body
> > File "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/re.py", line
> 212,
> > in split
> > return _compile(pattern, flags).split(string, maxsplit)
> > TypeError: expected string or bytes-like object
> >
> > During handling of the above exception, another exception occurred:
> >
> > Traceback (most recent call last):
> > File "/home/rdebroiz/.virtualenvs/quantivly/bin/alembic", line 11, in
> > 
> > sys.exit(main())
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/alembic/config.py",
> > line 486, in main
> > CommandLine(prog=prog).main(argv=argv)
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/alembic/config.py",
> > line 480, in main
> > self.run_cmd(cfg, options)
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/alembic/config.py",
> > line 463, in run_cmd
> > **dict((k, getattr(options, k, None)) for k in kwarg)
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/alembic/command.py",
> > line 180, in revision
> > revision_context.generate_scripts()
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/alembic/command.py",
> > line 179, in 
> > script for script in
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/alembic/autogenerate/api.py",
> > line 480, in generate_scripts
> > yield self._to_script(generated_revision)
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/alembic/autogenerate/api.py",
> > line 412, in _to_script
> > **template_args)
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/alembic/script/base.py",
> > line 574, in generate_revision
> > **kw
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/alembic/script/base.py",
> > line 439, in _generate_template
> > **kw
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/alembic/util/messaging.py",
> > line 47, in status
> > ret = fn(*arg, **kw)
> > File
> > "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-
> packages/alembic/util/pyfiles.py",
> > line 24, in template_to_file
> > "template-oriented traceback." % fname)
> > alembic.util.exc.CommandError: Template rendering failed; see
> > /tmp/tmph4dvwm5j.txt for a template-oriented

Re: autogenerate revision fails in a multi-db project generated with: `alembic init --template multidb alembic`

2018-08-10 Thread Mike Bayer
On Fri, Aug 10, 2018 at 6:47 AM,   wrote:
> Hello
>
> I'm trying to use alembic to generate a migration file in a multi-db
> environment. I first created the project using `alembic init --template
> multidb alembic`
> and then hack the `env.py` script (didn't touch to `run_migration_online`)
> to suit my needs.
>
> Here is the error I got after invoking `alembic --raiseerr revision
> --autogenerate -m 'First revision`:

have you also received the alembic.ini from that run, or was there a
previous alembic.ini present that prevented the new one from being
genreated?   the alembic.ini for multidb requires a "databases"
configuration:

databases = engine1, engine2

[engine1]
sqlalchemy.url = driver://user:pass@localhost/dbname

[engine2]
sqlalchemy.url = driver://user:pass@localhost/dbname2


I can reproduce your error if that section is missing.   Restore it,
and also put valid URLs in there, and then it works.If this is not
how you are configuring, then you need to alter the env.py to locate
your database URLs somehow.





>
> [...]
> Generating
> /home/rdebroiz/Quantivly/services/alembic/versions/201808-10-T12-30-48-first_revision-cb8c6da27574.py
> ... FAILED
> Traceback (most recent call last):
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/alembic/util/pyfiles.py",
> line 15, in template_to_file
> output = template.render_unicode(**kw).encode(output_encoding)
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/mako/template.py",
> line 471, in render_unicode
> as_unicode=True)
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/mako/runtime.py",
> line 838, in _render
> **_kwargs_for_callable(callable_, data))
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/mako/runtime.py",
> line 873, in _render_context
> _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/mako/runtime.py",
> line 899, in _exec_template
> callable_(context, *args, **kwargs)
> File "alembic_script_py_mako", line 62, in render_body
> File "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/re.py", line 212,
> in split
> return _compile(pattern, flags).split(string, maxsplit)
> TypeError: expected string or bytes-like object
>
> During handling of the above exception, another exception occurred:
>
> Traceback (most recent call last):
> File "/home/rdebroiz/.virtualenvs/quantivly/bin/alembic", line 11, in
> 
> sys.exit(main())
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/alembic/config.py",
> line 486, in main
> CommandLine(prog=prog).main(argv=argv)
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/alembic/config.py",
> line 480, in main
> self.run_cmd(cfg, options)
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/alembic/config.py",
> line 463, in run_cmd
> **dict((k, getattr(options, k, None)) for k in kwarg)
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/alembic/command.py",
> line 180, in revision
> revision_context.generate_scripts()
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/alembic/command.py",
> line 179, in 
> script for script in
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/alembic/autogenerate/api.py",
> line 480, in generate_scripts
> yield self._to_script(generated_revision)
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/alembic/autogenerate/api.py",
> line 412, in _to_script
> **template_args)
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/alembic/script/base.py",
> line 574, in generate_revision
> **kw
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/alembic/script/base.py",
> line 439, in _generate_template
> **kw
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/alembic/util/messaging.py",
> line 47, in status
> ret = fn(*arg, **kw)
> File
> "/home/rdebroiz/.virtualenvs/quantivly/lib/python3.6/site-packages/alembic/util/pyfiles.py",
> line 24, in template_to_file
> "template-oriented traceback." % fname)
> alembic.util.exc.CommandError: Template rendering failed; see
> /tmp/tmph4dvwm5j.txt for a template-oriented traceback.
>
>
> I kept the original `script.py.mako` template:
>
> <%!
> import re
>
> %>"""${message}
>
> Revision ID: ${up_revision}
> Revises: ${down_revision | comma,n}
> Create Date: ${create_date}
>
> """
> from alembic import op
> import sqlalchemy as sa
> ${imports if imports else ""}
>
> # revision identifiers, used by Alembic.
> revision = ${repr(up_revision)}
> down_revision = ${repr(down_revision)}
> branch_labels = ${repr(branch_labels)}
> depends_on = ${repr(depends_on)}
>
>
> def upgrade(engine_name):
> globals()["upgrade_%s" % engine_name]()
>
>
> def downgrade(engine_name):
> globals()["downgrade_%s" % engine_name]()
>
>