我的 User 模型是

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    # noinspection PyShadowingBuiltins
    uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
                  unique=True)
    email = Column('email', String, nullable=False, unique=True)
    _password = Column('password', String, nullable=False)
    created_on = Column('created_on', sa.types.DateTime(timezone=True),
                        default=datetime.utcnow())
    last_login = Column('last_login', sa.types.DateTime(timezone=True),
                        onupdate=datetime.utcnow())

其中 GUID 是自定义类型,如 sqlalchemy docs 中所述(完全相同)

现在当我跑
alembic revision --autogenerate -m "Added initial table"

我得到我的 upgrade() 作为
def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.create_table('users',
    sa.Column('uuid', sa.GUID(), nullable=False),
    sa.Column('email', sa.String(), nullable=False),
    sa.Column('password', sa.String(), nullable=False),
    sa.Column('created_on', sa.DateTime(timezone=True), nullable=True),
    sa.Column('last_login', sa.DateTime(timezone=True), nullable=True),
    sa.PrimaryKeyConstraint('uuid'),
    sa.UniqueConstraint('email'),
    sa.UniqueConstraint('uuid')
    )
    ### end Alembic commands ###

但是在应用 upgrade -> alembic upgrade head 期间,我看到
File "alembic/versions/49cc74d0da9d_added_initial_table.py", line 20, in upgrade
    sa.Column('uuid', sa.GUID(), nullable=False),
AttributeError: 'module' object has no attribute 'GUID'

我怎样才能让它在这里使用 GUID/custom 类型?

最佳答案

您可以根据方言将 sa.GUID() 替换为 sa.CHAR(32)UUID() (添加导入行 from sqlalchemy.dialects.postgresql import UUID 后)。

GUID() 替换它(在添加导入行 from your.models.custom_types import GUID 之后)也可以,但是升级脚本与您的模型代码相关联,这可能不是一件好事。

关于python - Alembic:如何在模型中迁移自定义类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15668115/

10-15 17:36