0

我正在开发一个项目,该项目既有旧的基于sqlalchemy-migrate的迁移,也有新的基于alembic的迁移。我正在尝试删除前者。撕掉它很容易,但是当我这样做后运行一些测试时,我看到了以下失败:

Traceback (most recent call last):                                                                                                                                                                             
                                                                                                                                                                                                                   
  File "/home/user/myproject/.tox/functional/lib/python3.7/site-packages/sqlalchemy/sql/elements.py", line 747, in __getattr__                                                        
return getattr(self.comparator, key)                                                                                                                                                                           
                                                                                                                                                                                                                   
AttributeError: 'Comparator' object has no attribute 'alter'

但是,我注意到当我将migratesqlalchemy-migrate)模块的导入重新添加到任何剩余的alembic迁移中时,事情又开始工作了吗?为什么alter没有这个模块该方法会消失?

4

1 回答 1

0

原因是较新的alembic迁移之一是使用sqlalchemy-migrate似乎猴子修补的alter方法。具体来说,我需要更改以下内容:

images = Table('images', meta, autoload=True)
images.c.is_public.alter(nullable=True, server_default=None)

至:

with op.batch_alter_table('images') as batch_op:
    batch_op.alter_column('is_public', nullable=True, server_default=None)

(我不得不这样做,而不是op.alter_column因为这与 SQLite 不兼容)。

于 2020-10-30T10:01:17.210 回答