Thanks for pointing me in the right direction @zzzeek. For me it worked really well to just add these lines to *alembic.autogenerate.render*:
@renderers.dispatch_for(ops.ExecuteSQLOp) def _execute_sql(autogen_context, op): assert isinstance(op.sqltext, str) return 'op.execute({})'.format(op.sqltext) Is this perhaps something that could be included in alembic? I noticed that I couldn't make a PR at Bitbucket, so I made one at the github mirror: https://github.com/zzzeek/alembic/pull/20 On Wednesday, October 28, 2015 at 10:07:14 PM UTC+1, Michael Bayer wrote: > > > > On 10/28/15 1:57 PM, Jacob Magnusson wrote: > > Hi, > > > > I have a use-case where I need to execute a function called > > *audit_table* after a new table is created in my migrations. So I > > thought I would be able to use alembic.operations.ops.ExecuteSQLOp > > < > http://alembic.readthedocs.org/en/latest/api/operations.html#alembic.operations.ops.ExecuteSQLOp>, > > > > but I can't find any code that shows me how to actually use it. By > > reading the API documentation I thought this would be the way: > > > > > > from alembic.autogenerate import rewriter > > from alembic.operations import ops > > > > writer = rewriter.Rewriter() > > > > @writer.rewrites(ops.CreateTableOp) > > def create_table(context, revision, op): > > return [ > > op, > > ops.ExecuteSQLOp( > > sa.select([sa.func.audit_table(op.table_name)]) > > ) > > ] > > > > def run_migrations_online(): > > ... > > context.configure( > > ..., > > process_revision_directives=writer, > > > > > > But then I get the following traceback: > > > > Traceback (most recent call last): > > File "/venv/bin/alembic", line 11, in <module> > > sys.exit(main()) > > File "/venv/lib/python3.5/site-packages/alembic/config.py", line 450, > > in main > > CommandLine(prog=prog).main(argv=argv) > > File "/venv/lib/python3.5/site-packages/alembic/config.py", line 444, > > in main > > self.run_cmd(cfg, options) > > File "/venv/lib/python3.5/site-packages/alembic/config.py", line 427, > > in run_cmd > > **dict((k, getattr(options, k)) for k in kwarg) > > File "/venv/lib/python3.5/site-packages/alembic/command.py", line 121, > > in revision > > revision_context.generate_scripts() > > File "/venv/lib/python3.5/site-packages/alembic/command.py", line 120, > > in <listcomp> > > script for script in > > File "/venv/lib/python3.5/site-packages/alembic/autogenerate/api.py", > > line 430, in generate_scripts > > yield self._to_script(generated_revision) > > File "/venv/lib/python3.5/site-packages/alembic/autogenerate/api.py", > > line 354, in _to_script > > autogen_context, migration_script, template_args > > File > > "/venv/lib/python3.5/site-packages/alembic/autogenerate/render.py", line > > 40, in _render_python_into_templatevars > > _render_cmd_body(upgrade_ops, autogen_context)) > > File > > "/venv/lib/python3.5/site-packages/alembic/autogenerate/render.py", line > > 63, in _render_cmd_body > > lines = render_op(autogen_context, op) > > File > > "/venv/lib/python3.5/site-packages/alembic/autogenerate/render.py", line > > 74, in render_op > > renderer = renderers.dispatch(op) > > File "/venv/lib/python3.5/site-packages/alembic/util/langhelpers.py", > > line 309, in dispatch > > raise ValueError("no dispatch function for object: %s" % obj) > > ValueError: no dispatch function for object: > > <alembic.operations.ops.ExecuteSQLOp object at 0x10f236860> > > > > I've also tried to pass in the SQL command as a regular string to > > ExecuteSQLOp, but I still get the same exception. > > > > Could someone tell me what the correct way to use it is? Perhaps I > > haven't understood correctly what *ExecuteSQLOp* is used for. > > ah, wow, OK. Well sure, ExecuteSQLOp is used for executing SQL but it > currently does not have an "autogenerate" render directive, that is, the > directive which writes it into a new migration script, since that would > require writing out all the Python code for > "sa.select([sa.func.audit_table(op.table_name)])" which is an immensely > difficult task. > > You can build yourself a render function for ExecuteSQLOp following the > instructions at > > http://alembic.readthedocs.org/en/latest/api/autogenerate.html#creating-a-render-function, > > > where you'd have to figure out what Python code you actually want to > render. Which means you might have an easier time just making yourself > a RunAuditTableOp object instead so that the way to render in an > autogenerate script is straightforward. > > > > > > > Thanks, > > Jacob > > > > -- > > 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 > <javascript:> > > <mailto:sqlalchemy-alembic+unsubscr...@googlegroups.com <javascript:>>. > > 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.