Looks like alembic_cfg only accepts string options. (set_main_option()). Is there a way to pass connect object? Thanks.
Cheers, Pan On Wed, Dec 24, 2014 at 8:35 AM, Michael Bayer <mike...@zzzcomputing.com> wrote: > > > Pan Luo <luopa...@gmail.com> wrote: > > If someone new come to the project and they use db.create_all() or some > script to create a fresh new database with declared models. There is no > alembic_version table and he/she will run into problems when doing the > upgrade. Is there something in alembic to support it? I have been poking > around and came up with the following: > > alembic_cfg = Config("alembic.ini") > context = MigrationContext.configure(db.engine.connect()) > current_rev = context.get_current_revision() > context._ensure_version_table() > > script = ScriptDirectory.from_config(alembic_cfg) > head_revision = script.get_current_head() > context.stamp(script, head_revision) > > command.downgrade(alembic_cfg, "base") > > However, it works with file based sqlite db but no in memory one: > Error: Destination base is not a valid downgrade target from current head(s) > > It seems the migrationcontext use different from the one I generated and > the one used in the alembic, so the current revision was empty when I do > the downgrade (just for. Not sure why file based sqlite works. > > > A SQLite :memory: database only exists with the span of a single SQLite > database connection. You get that above when you call > db.engine.connect(). But then when you call command.downgrade(), you are > not passing this connection to that command in any way; the connection is > stuck inside your MigrationContext which isn’t present in > command.downgrade(alembic_cfg). command.downgrade() then calls upon your > env.py in order to get the database connection, and you probably have > another engine.connect() in there using a different engine (and therefore > connection pool). This makes a brand new :memory: connection that has no > state on it. > > So you’d want to send an argument into the alembic_cfg in this case which > refers to that connection from db.engine.connect(), which your env.py can > pull out and make use of instead of connecting in some other way. This > requires modifications to your env.py to look for this connection and use > it, instead of connecting again. Or you can set up this connection as a > global variable somewhere. > > This is a common issue so at some point I will add recipes to the > documentation that show how to transfer a connection from the outside of > command.xyz(), through the env.py and into the migration context. > > > -- > You received this message because you are subscribed to a topic in the > Google Groups "sqlalchemy-alembic" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sqlalchemy-alembic/1EMiDnOlQjI/unsubscribe > . > To unsubscribe from this group and all its topics, send an email to > 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.