小编Het*_*oni的帖子

Alembic使用现有的SQLAlchemy引擎进行迁移

我在sqlite内存DB上创建了一个SQLAlchemy声明式Base:

engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Run Code Online (Sandbox Code Playgroud)

我正在使用它来进行单元测试逻辑.

有了这个我在DB中有我的表.但现在我希望使用alembic迁移某些东西.

AFAIK env.pyalembic 迁移使用run_migrations_online,并使用一个名为engine_from_config在此创建新引擎的SQLAlchemy函数.

我想要解决的问题是有一种方法可以使用先前创建的连接,该连接保存最近创建的表,用于alembic迁移.

我在我的测试脚本上使用了这个:在应用程序代码中使用Alembic API,以便我的脚本在上一次create_all调用之后执行以下操作:

import alembic.config
alembicArgs = ['--raiseerr', '-x', 'dbPath=sqlite:///:memory:', 'upgrade', 'head']
alembic.config.main(argv=alembicArgs
Run Code Online (Sandbox Code Playgroud)

[请注意,我只是通过Base.metadata.create_all(engine)调用创建我的模式,但我的alembic版本不仅包含模式更改,它们还有一些目录表数据的填充,这就是为什么我打算在这里使用alembic.事实上,如果我的alembic迁移持有一些"创建表"逻辑,那么这两者就会发生冲突.所以我可以安全地删除create_all调用并依赖于alembic来创建我的模式.]

已经修改了我的alembic env.py:

def run_migrations_online():
    ini_section = config.get_section(config.config_ini_section)

    db_path = context.get_x_argument(as_dictionary=True).get('dbPath')

    if db_path:
        ini_section['sqlalchemy.url'] = db_path

    connectable = engine_from_config(
        ini_section,
        prefix ... # everything from here the same as default env.py
Run Code Online (Sandbox Code Playgroud)

据我所知,connectable=engine_from_config在新sqlite:///:memory:数据库上创建了与新引擎的连接,这就是为什么我无法通过alembic升级我脚本中先前创建的数据库的原因create_all(engine).

所以...... TLDR; 有没有办法将我以前存在的引擎连接(使用我创建的表)传递给alembic,以便它可以迁移它?(我很确定我创建的dbPath arg在这里没用,事实上,我只是复制我引用的其他帖子使用的内容).

python sqlite sqlalchemy database-migration alembic

9
推荐指数
1
解决办法
888
查看次数

PyCharm类型暗示枚举迭代

Python的枚举类支持迭代,但PyCharm很难搞清楚这一点.

from enum import Enum

class Color(Enum):
    RED = 0
    BLUE = 1

for color in Color:
    # Warning: Expected 'collections.Iterable', got 'Type[Color]' instead
    print(color)
Run Code Online (Sandbox Code Playgroud)

虽然这种方法EnumMeta.__iter__存在,但PyCharm很难解决这个问题.

我不介意手动添加类型提示来解决问题,我只是不确定什么和在哪里.

python enums type-hinting pycharm

9
推荐指数
1
解决办法
897
查看次数

如何使用Python将默认应用程序映射到Windows中的文件扩展名

我想使用文件扩展名作为参数(例如".jpg")查询Windows,并返回任何应用程序窗口已配置为此文件类型的默认应用程序的路径.

理想情况下,解决方案看起来像这样:

from stackoverflow import get_default_windows_app

default_app = get_default_windows_app(".jpg")

print(default_app)
"c:\path\to\default\application\application.exe"
Run Code Online (Sandbox Code Playgroud)

我一直在调查winreg builtin库,它保存了windows的注册表信息,但是我无法理解它的结构,文档非常复杂.

我正在运行Windows 10和Python 3.6.

有没有人有任何想法可以提供帮助?

python-3.x windows-10

5
推荐指数
1
解决办法
211
查看次数

将类标记为抽象而不定义任何抽象方法

我正在寻找这样的东西:

from abc import ABC

@abstractclass
class A(ABC):
    pass

A()  # FAILS

class B(A):
    pass

B()  # SUCCEEDS
Run Code Online (Sandbox Code Playgroud)

我知道装饰c'tor或在某些假设法的选项Aabstractmethod,但这需要我来覆盖它B。这正是我想要避免的。

python

4
推荐指数
1
解决办法
421
查看次数

six.moves.builtins.range在Python 2和Python 3中不一致

对于一个非常大的整数范围,xrange应该使用(Python 2),它range在Python 3中重命名.我假设模块six可以提供一致的写作原因.

但我发现six.moves.builtins.range在Python 2中返回一个列表,在Python 3中返回一个可迭代的非列表对象,就像名字range一样.

此外,six.moves.builtins.xrangePython 2中不存在.

我使用了错误的功能six吗?或者六个根本没有提供rangexrange功能的解决方案?

我知道我可以相应地测试sys.version[0]和重命名该功能.我只是在寻找"不要重复自己"的解决方案.

附加

如mgilson所述:

>>> import six 
>>> six.moves.range
AttributeError: '_MovedItems' object has no attribute 'range'
Run Code Online (Sandbox Code Playgroud)

它是与版本相关的东西six,还是没有这样的东西six.moves.range

python portability

3
推荐指数
1
解决办法
5708
查看次数