以编程方式获取Alembic数据库版本

K E*_*gle 5 python sqlalchemy alembic

我正试图弄清楚如何使用Alembic获取我的数据库版本.我已经将数据库设置为使用alembic并成功执行了升级和降级.我现在想从我自己的python脚本中获取此版本.

我试图创建一个这样做的功能

def get_current_database_version():
    path = os.path.join(os.path.dirname(__file__), os.path.pardir)
    alembic_cfg = Config(os.path.join(path, 'alembic.ini'))
    current_rev = command.current(alembic_cfg, head_only=True)
    return current_rev
Run Code Online (Sandbox Code Playgroud)

这个函数返回了一个 NoSectionError: No section: 'formatters'

然后我去了我的alembic.ini文件,检查它是否有格式化区域.这是我的alembic.ini文件:

# A generic, single database configuration.

[alembic]
# path to migration scripts
script_location = alembic
pyramid_config_file = ../../development.ini

# template used to generate migration files
# file_template = %%(rev)s_%%(slug)s

# max length of characters to apply to the
# "slug" 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

sqlalchemy.url = sqlite:///%(here)s/mgo.sqlite


# 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
Run Code Online (Sandbox Code Playgroud)

谁知道我做错了什么?谢谢

编辑:

这是我尝试使用MigrationContext来解决问题:

def get_database_revision():
    engine = create_engine("sqlite:///../mgo.db")
    conn = engine.connect()
    context = MigrationContext.configure(conn)
    current_rev = context.get_current_revision()
    return current_rev
Run Code Online (Sandbox Code Playgroud)

它连接但没有返回.使用sqlite浏览器我可以看到数据库中的版本未设置为none.

Sim*_*ser 9

您可以使用MigrationContext,以获得最新的版本:

from alembic.migration import MigrationContext
from sqlalchemy import create_engine

engine = create_engine("postgresql://mydatabase")
conn = engine.connect()

context = MigrationContext.configure(conn)
current_rev = context.get_current_revision()
Run Code Online (Sandbox Code Playgroud)

在里面env.py你可以使用:

from alembic import context
migration_context = context.get_context()
current_rev = context.get_current_revision()
Run Code Online (Sandbox Code Playgroud)

最后,它基本上归结为连接到数据库并查看alembic_version表.它包含迁移版本作为值,这是数据库当前所在的位置(根据alembic).所以你可以用你想要的任何方式编写代码,只要这最终你正在做什么.

  • 我改变了我的代码来尝试这个,但它也不起作用。它返回无。 (2认同)

小智 6

我建议使用 stdout Config() 对象参数(请参阅此处)以允许将 sys.stdout 重定向到 StringIO 缓冲区,如下所示:

output_buffer = io.StringIO()
alembic_cfg = alembic_Config('/path/to/alembic.ini', stdout=output_buffer)
alembic_command.current(alembic_cfg)
output = output_buffer.getvalue()
print(output)
Run Code Online (Sandbox Code Playgroud)