gpt4 book ai didi

python - 从应用程序代码内部使用 Alembic API

转载 作者:IT老高 更新时间:2023-10-28 21:54:56 25 4
gpt4 key购买 nike

我使用 SQLite 作为我的基于 PySide 的桌面应用程序的应用程序文件格式(请参阅 here 了解为什么要这样做)。也就是说,当用户使用我的应用程序时,他们的数据会保存在他们机器上的单个数据库文件中。我正在使用 SQLAlchemy ORM 与数据库进行通信。

当我发布应用程序的新版本时,我可能会修改数据库架构。我不希望用户每次更改架构时都必须丢弃他们的数据,因此我需要将他们的数据库迁移到最新格式。此外,我创建了很多临时数据库来保存数据的子集以供某些外部进程使用。我想用 alembic 创建这些数据库,以便将它们标记为正确的版本。

我有几个问题:

  • 有没有办法从我的 Python 代码中调用 alembic?我认为必须将 Popen 用于纯 Python 模块很奇怪,但文档只使用命令行中的 alembic。主要是,我需要将数据库位置更改为用户数据库所在的位置。

  • 如果这不可行,我可以在不编辑 .ini 文件的情况下从命令行指定一个新的数据库位置吗?这将使通过 Popen 调用 alembic 没什么大不了的。

  • 我看到 alembic 将其版本信息保存在一个名为 alembic_version 的简单表中,其中有一列名为 version_num,单行指定版本。我可以在我的架构中添加一个 alembic_version 表,并在创建新数据库时用最新版本填充它,这样就没有开销了吗?这还是个好主意吗?我应该只使用 alembic 来创建所有数据库吗?

我在项目目录中使用的单个数据库非常适合用于开发的单个数据库。我想使用 alembic 在任意位置方便地迁移和创建数据库,最好是通过某种 Python API,而不是命令行。此应用程序也被 cx_Freeze 卡住,以防万一。

谢谢!

最佳答案

以下是我在将我的软件连接到 alembic 后学到的知识:

有没有办法从我的 Python 代码中调用 alembic?

是的。在撰写本文时,alembic 的主要入口点是 alembic.config.main。 ,所以你可以导入它并自己调用它,例如:

import alembic.config
alembicArgs = [
'--raiseerr',
'upgrade', 'head',
]
alembic.config.main(argv=alembicArgs)

请注意,alembic 在当前目录中查找迁移(即 os.getcwd())。我在调用 alembic 之前使用 os.chdir(migration_directory) 处理了这个问题,但可能有更好的解决方案。


我可以在不编辑 .ini 文件的情况下从命令行指定新的数据库位置吗?

是的。关键在于 -x 命令行参数。来自 alembic -h(令人惊讶的是,我无法在文档中找到命令行参数引用):

optional arguments:
-x X Additional arguments consumed by custom env.py
scripts, e.g. -x setting1=somesetting -x
setting2=somesetting

因此您可以创建自己的参数,例如dbPath,然后在env.py中截取:

alembic -x dbPath=/path/to/sqlite.db 升级头

然后以 env.py 为例:

def run_migrations_online():   
# get the alembic section of the config file
ini_section = config.get_section(config.config_ini_section)

# if a database path was provided, override the one in alembic.ini
db_path = context.get_x_argument(as_dictionary=True).get('dbPath')
if db_path:
ini_section['sqlalchemy.url'] = db_path

# establish a connectable object as normal
connectable = engine_from_config(
ini_section,
prefix='sqlalchemy.',
poolclass=pool.NullPool)

# etc

当然,您也可以在 alembic.config.main 中使用 argv 提供 -x 参数。

我同意 @davidism关于使用迁移与 metadata.create_all() :)

关于python - 从应用程序代码内部使用 Alembic API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24622170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com