如何在SQLAlchemy模型中使用SQLAlchemy Utils

如何在SQLAlchemy模型中使用SQLAlchemy Utils,sqlalchemy,sqlalchemy-utils,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=Fals

我正在尝试创建一个使用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`
我试图明确地告知我正在使用的模块,就像使用一个“内部”实现一样

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

我使用
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作为主键,您只需添加:

import sqlalchemy_utils

到你的script.py.mako in migrations文件夹

谢谢,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\u migrations\u online
中设置了
render\u item=render\u item

context.configure(
    ...,
    render_item=render_item,
    ...
)
我研究过自动完成这项工作,但我找不到任何可以帮助我的东西

行动顺序至关重要:

  • export FLASK\u APP=manage.py

  • flask db init

  • 完成上面的教程

  • db迁移

  • flask数据库升级


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


    注意:尽管在多个地方看到了只将导入行添加到
    script.py.mako
    文件的建议,但这对我来说并不奏效。

    我做了一件非常类似的事情——如果我只将导入添加到script.py.mako文件中,则将该行添加到我的migrations/versions/9d34543545.py文件的顶部不足以解决问题。