【问题标题】:How to use SQLAlchemy Utils in a SQLAlchemy model如何在 SQLAlchemy 模型中使用 SQLAlchemy Utils
【发布时间】:2019-06-01 00:01:40
【问题描述】:

我正在尝试创建一个使用 UUID 作为主键的用户模型:

from src.db import db # SQLAlchemy instance

import sqlalchemy_utils

import uuid


class User(db.Model):
    __tablename__ = 'user'

    id = db.Column(sqlalchemy_utils.UUIDType(binary=True), primary_key=True, nullable=False)

但是当我生成我收到的迁移时:

File "/home/pc/Downloads/project/auth/venv/lib/python3.6/site-packages/alembic/runtime/environment.py", line 836, in run_migrations
    self.get_context().run_migrations(**kw)
  File "/home/pc/Downloads/project/auth/venv/lib/python3.6/site-packages/alembic/runtime/migration.py", line 330, in run_migrations
step.migration_fn(**kw)
  File "/home/pc/Downloads/project/auth/migrations/versions/efae4166f832_.py", line 22, in upgrade
    sa.Column('id', sqlalchemy_utils.types.uuid.UUIDType(length=16), nullable=False),
NameError: name 'sqlalchemy_utils' is not defined`

我曾尝试像this 一样明确告知我正在使用的模块,并使用SQLAlchemy 的“内部”实现

Obs:如果我在 /migrations/version/efae4166f832_.py 中手动导入 sqlalchemy_utils 并删除自动生成的长度 sa.Column('id', sqlalchemy_utils.types.uuid.UUIDType(length=16), nullable=False) 它可以工作 fine

我使用generate.py 脚本生成迁移:

from src import create_app

from src.db import db

from flask_migrate import Migrate

# Models

from src.user.models.user import User

app = create_app()

migrate = Migrate(app, db)`

Obs:MySQL 引擎

我希望当我生成迁移时,它会生成一个用户模型,该模型使用从 SQLAlchemy Utils 实现的 UUID 作为主键

【问题讨论】:

    标签: sqlalchemy sqlalchemy-utils


    【解决方案1】:

    您只需添加:

    import sqlalchemy_utils
    

    到迁移文件夹中的 script.py.mako

    【讨论】:

    • 我做了一些非常相似的事情 - 将该行添加到我的 migrations/versions/9d34543545.py 文件的顶部
    • 如果我只在script.py.mako文件中添加导入是不足以解决问题的。
    【解决方案2】:

    谢谢,Marco,但我已经修好了。我已经把 import import sqlalchemy_utils 放在 env.pyscript.py.mako 里面,我还放了以下函数:

    def render_item(type_, obj, autogen_context):
        """Apply custom rendering for selected items"""
    
        if type_ == "type" and isinstance(obj, sqlalchemy_utils.types.uuid.UUIDType):
            # Add import for this type
            autogen_context.imports.add("import sqlalchemy_utils")
    
            autogen_context.imports.add("import uuid")
    
            return "sqlalchemy_utils.types.uuid.UUIDType(), default=uuid.uuid4"
    
        # Default rendering for other objects
        return False
    

    env.py中,我在函数run_migrations_online中设置了render_item=render_item

    context.configure(
        ...,
        render_item=render_item,
        ...
    )
    

    我研究了自动执行此操作,但找不到任何可以帮助我的东西。

    操作顺序很重要:

    1. export FLASK_APP=manage.py

    2. flask db init

    3. 按照上面的教程做

    4. flask db migrate

    5. flask db upgrade

    【讨论】:

      【解决方案3】:

      import sqlalchemy_utils 行添加到新创建的migrations/versions/{hash}_my_comment.py 文件中。但是,这只会解决迁移的特定步骤的问题。如果您希望对引用 sqlalchemy_utils 的列进行大量更改,您可能应该像 Walter 的建议那样做一些更强大的事情。尽管如此,看起来您可能需要添加代码来正确处理您最终使用的每种列类型。

      注意:尽管在多个地方看到了将导入行添加到 script.py.mako 文件的建议,但这对我不起作用。

      【讨论】:

        【解决方案4】:

        script.py.mako 文件中添加import sqlalchemy_utils 将自动在生成的所有迁移文件上导入此行并解决问题。

        from alembic import op
        import sqlalchemy as sa
        import sqlalchemy_utils
        ${imports if imports else ""}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-14
          • 2013-10-07
          • 2020-05-15
          • 2021-01-26
          • 2018-04-24
          • 1970-01-01
          • 2020-02-21
          • 1970-01-01
          相关资源
          最近更新 更多