如何在SQLAlchemy模型中使用SQLAlchemy实用工具

时间:2019-01-05 19:27:50

标签: sqlalchemy sqlalchemy-utils

我正在尝试创建一个使用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:如果我手动将sqlalchemy_utils导入/migrations/version/efae4166f832_.py并删除自动生成的长度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)`

enter image description here

obs:MySQL引擎

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

3 个答案:

答案 0 :(得分:0)

您只需添加:

import sqlalchemy_utils

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

答案 1 :(得分:0)

谢谢Marco,但是我已经解决了。我已将导入import sqlalchemy_utils放在 env.py script.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 内部,并且在同一文件中,我在函数render_item=render_item中设置了run_migrations_online

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

答案 2 :(得分:0)

import sqlalchemy_utils行添加到新创建的migrations/versions/{hash}_my_comment.py文件中。但是,这只会解决迁移的特定步骤的问题。如果您希望对引用sqlalchemy_utils的列进行大量更改,那么您可能应该做一些更稳健的操作,例如Walter的建议。即使如此,您似乎仍需要添加代码以正确处理最终使用的每种列类型。

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